2009-06-30 8 views
18

मैं एक नियम इंजन लिखने की प्रक्रिया में हूं जो सशर्त संरचनाओं द्वारा निर्धारित सरल असाइनमेंट करता है। यह परियोजना की एक शर्त है कि नियम एक्सएमएल प्रारूप में हैं। मैंने सरल कोड ब्लॉक के समान मेरे एक्सएमएल स्कीमा को मॉडल किया है। मैं एक्सएमएल को पार्स करना चाहता हूं और फिर इसे जावा कोड में बदलना चाहता हूं। मैं फिर रनटाइम पर इस कोड को संकलित करना और चलाने की इच्छा करता हूं। ऐसा करने का मतलब यह होगा कि मेरा नियम इंजन अब दुभाषिया के रूप में कार्य नहीं करता है बल्कि मूल जावा बाइट कोड निष्पादित करता है।मैं रनटाइम पर जावा क्लास को संकलित और तैनात कैसे कर सकता हूं?

मैंने पार्सिंग चरण और जावा कोड जनरेशन चरण को कम या कम पाया है। अब मैं अंतिम चरण को समझना चाहता हूं - रनटाइम चरण पर संकलन। Compile to java bytecode (without using Java) मैं संभव समाधान निम्नलिखित के बारे में पता बन गए हैं:

मैं इनमें से एक तुलना प्यार के साथ-साथ हैं

इस सूत्र के बाद रनटाइम चरण पर जावा संकलन को हल करने के लिए अन्य सुझाव।

+2

बिना रनटाइम पर अपने कोड संकलन कर सकते हैं आपके लिए पॉइंटर्स का युगल: 1) टॉमकैट स्रोत डाउनलोड करें, जब यह जेएसपी के लिए कक्षाएं बनाता है तो इसे केवल वही करना है जो आप वर्णन करते हैं। 2) ड्रूल्स (http://www.jboss.org/drools/) पर एक नज़र डालें। मैंने इसे अतीत में उपयोग किया है और जब यह नियम इंजनों की बात आती है तो यह बहुत शक्तिशाली है। –

+0

क्या आपने कभी यह एप्लिकेशन पूरा किया है? यदि आप स्रोतों को साझा करने में सक्षम हैं तो मुझे यह देखने में दिलचस्पी होगी कि यह कैसे काम करता है। –

+0

@EricB। खुशी है कि आपने रुचि दिखाई है। दुर्भाग्य से आवेदन ने कहीं और मोड़ लिया। मैं जावा 6 कंपाइलर एपीआई का उपयोग करने के लिए चला गया, लेकिन एक बहुत ही सरल दायरे के लिए। दूसरे शब्दों में, एक्सएमएल कोड ब्लॉक अभी भी इस दिन संकलित नहीं किए गए हैं ... मैं कोड लिख नहीं सकता क्योंकि मैंने लिखा है क्योंकि यह स्वामित्व है ... – Yaneeve

उत्तर

4

आप इसे क्लोजर कोड में बदल सकते हैं, और क्लोजर कंपाइलर इसे आपके लिए बाइटकोड में बदल देगा।

+0

क्या आप कृपया विस्तृत कर सकते हैं? – Yaneeve

+1

@Yaneeve, Clojure (http://clojure.org/) JVM के लिए लिखी गई एक लिस्पी बोली है। यदि आप अपने टैग के अर्थशास्त्र को लिस्प फ़ंक्शंस/मैक्रोज़ के रूप में कार्यान्वित करना चाहते थे, तो अपने एक्सएमएल संरचनाओं से संबंधित लिस्पी संरचनाओं में परिवर्तित करने के लिए यह छोटा होना चाहिए, जिसे आप चाहें तो कक्षा में संकलित किया जा सकता है। अगर एक्सएमएल की आवश्यकता नहीं थी, तो मैं कहूंगा कि लिस्प डेटा का उपयोग शुरू करें। जावा + एक्सएमएल-केंद्रित चर्चा के लिए क्यों, देखें: http://www.defmacro.org/ramblings/lisp.html – kwatford

+2

बस कुछ वर्षों से आपके उत्तर में वापस आ गया और अब मुझे लगता है कि आपका सुझाव दिमाग है बह।बहुत बुरा मैं उस समय, और औसत डेवलपर/प्रबंधक लिस्प और कार्यात्मक कोडिंग के संदर्भ में नहीं सोचता था और न ही करता था। आपके द्वारा सुझाए गए सुझावों के उदाहरण के रूप में, मुझे लगता है कि, रीमैन: http://riemann.io/ – Yaneeve

1

अपने आप को परेशानी बचाएं और BeanShell का उपयोग करें जैसा कि यहां Executing java code given in a text file बताया गया है।

बीनशेल क्या है?

BeanShell एक छोटा, मुफ्त, तब एम्बेड जावा स्रोत ऑब्जेक्ट पटकथा भाषा सुविधाओं, जावा में लिखा साथ दुभाषिया है। BeanShell गतिशील रूप से मानक जावा सिंटैक्स निष्पादित करता है और इसे सामान्य स्क्रिप्टिंग ढीले प्रकार, कमांड, और जैसे पर्ल और जावास्क्रिप्ट में विधि बंद करने के साथ विस्तारित करता है।

आप जावा प्रयोग और डिबगिंग के लिए BeanShell सहभागी उपयोग कर सकते हैं और साथ ही नए तरीके में अपने ऐप्लिकेशन विस्तार करने के लिए। पटकथा जावा ही उधार देता है तेजी से प्रोटोटाइप, उपयोगकर्ता पटकथा विस्तार, नियम इंजन, विन्यास, परीक्षण, गतिशील तैनाती, एम्बेडेड सिस्टम, और यहां तक ​​कि जावा शिक्षा सहित आवेदनों की एक विस्तृत विविधता के लिए।

BeanShell छोटे और एम्बेड करने योग्य है, इसलिए आप रन-टाइम में गतिशील रूप से जावा कोड निष्पादित करने के लिए अपने जावा अनुप्रयोगों से BeanShell कॉल कर सकते हैं या अपने अनुप्रयोगों में तानाना प्रदान करने के लिए। वैकल्पिक रूप से, आप जावा अनुप्रयोगों में हेरफेर करने के लिए स्टैंडअलोन बीनशेल स्क्रिप्ट का उपयोग कर सकते हैं; जावा ऑब्जेक्ट्स और एपीआई गतिशील रूप से काम कर रहे हैं।चूंकि BeanShell जावा में लिखा गया है और आपके एप्लिकेशन के रूप में उसी वीएम में चलाता है, तो आप स्क्रिप्ट में "लाइव" ऑब्जेक्ट्स के संदर्भों को स्वतंत्र रूप से पास कर सकते हैं और परिणाम के रूप में लौटा सकते हैं।

संक्षेप में, BeanShell गतिशील जावा व्याख्या की है, के साथ साथ एक पटकथा भाषा और लचीला पर्यावरण सभी एक स्वच्छ पैकेज में गिर गयी है।

+0

अगर मैं गलत हूं, तो मुझे सही करें, हालांकि, बीनशेल एक दुभाषिया है और इसलिए जावा बाइट कोड नहीं बनायेगा इसके निष्पादन का परिणाम ... – Yaneeve

+0

हां, मुझे लगता है कि बीनशेल का अर्थ है। मैंने इसका उल्लेख करने का कारण यह है कि मुझे लगता है कि आप अपने नियम इंजन में अधिक जटिल संरचनाओं को व्यक्त करने के लिए जावा का उपयोग करना चाहते हैं, इस मामले में जावा कोड संकलित या व्याख्या की गई है? –

+0

इससे कोई फर्क नहीं पड़ता क्योंकि सीपीयू और मेमोरी पर्यावरण में किसी समस्या का है, मुझे तैनात करना होगा ... – Yaneeve

2

जीवीवी पर आधारित ग्रोवी, बीनशेल या किसी भी अन्य स्क्रिप्टिंग भाषा में रनटाइम पर कोड इंजेक्ट, संशोधित, जोड़ने और चलाने की सुविधा है। असल में सभी स्क्रिप्टिंग भाषा का अर्थ है, इसलिए वास्तव में वे रनटाइम पर संकलित नहीं हो रहे हैं।

1

आप इस

Process p = Runtime.getRuntime().exec("java -classpath "..." SomeClassContainingMain ...other arguments);  

     //you need to consume the outputs of the command if output/error is large otherwise the process is going to hang if output/error buffer is full. and create a seperate thead for it (not created here). 
     log.debug("PROCESS outputstream : " + p.getInputStream()); 
     log.debug("PROCESS errorstream : " + p.getErrorStream());   
    p.waitFor(); // Wait till the process is finished 

की तरह एक प्रक्रिया बांट सकते हैं और संकलन और चला सकते हैं।

2

जावास्क्रिप्ट जावा में लगभग एक पूर्ण जावा कंपाइलर लिखा गया है, और यह पूरी तरह जावा से बना है। आप इसे एक बार पूरी तरह से .java फ़ाइल नहीं दे सकते हैं, लेकिन आप इसे व्यक्तिगत कार्यों के लिए कोड स्ट्रिंग दे सकते हैं और उन्हें उसी सीटी क्लास ऑब्जेक्ट में जोड़ सकते हैं, जो बाइटकोड बन जाता है और फिर java.lang.Class।

मैंने अभी GigaLineCompile के संस्करण 0.1 को जारी किया है, जो जैवसिस्ट (कंपाइलर) और बीन्सहेल (दुभाषिया) का एक साथ उपयोग करता है और आपको नियंत्रण देता है कि कौन सा कोड अनुकूलित करने और कब। बाद के संस्करणों में, यह जवासिस्ट और बीन्सहेल के बीच एक छोटी ग्रैन्युलरिटी में बदल जाएगा, इसलिए यदि आपके पास कोड के कई तार हैं जो कुछ सबस्ट्रिंग्स साझा करते हैं, तो सबस्ट्रिंग संकलित हो जाएंगी और अन्य भाग बीन्सहेल में चलेंगे। यह कृत्रिम बुद्धि के लिए अधिक उपयोगी है जो जावा कोड उत्पन्न करता है, लेकिन यह क्लोजर या अकेले जावसिस्ट/बीन्सहेल की चरम सीमा का विकल्प भी है।

Javassist, BeanShell, और GigaLineCompile यहाँ (स्रोत के साथ) डाउनलोड किया जा सकता: http://sourceforge.net/projects/gigalinecompile

संबंधित मुद्दे

 संबंधित मुद्दे