(मुझे पता है यह How can I embed Clojure in an RCP application से संबंधित है, लेकिन है कि धागा पुरानी है और मेरी सेटअप कुछ अलग है)Clojure classpath मुद्दा
मैं ग्रहण 3.7.1 का उपयोग कर रहा है और दिनों के लिए अब है Clojure (जितना संभव हो सके) में एक ग्रहण/आरसीपी ऐप लिखने की कोशिश कर रहा है। मैं clojure.osgi और CCW के स्रोत संस्करण बनाने की कोशिश की, RCPClojure डेमो परियोजना और कई अन्य चीजों की कोशिश की है है। उनमें से प्रत्येक ने काम नहीं किया (मुख्य रूप से प्रतीत होता है "अपरिवर्तनीय" बिल्ड/क्लासपाथ त्रुटियों, अप-टू-डेट दस्तावेज़/प्रतिक्रिया, संस्करण विवाद आदि की कमी ...)
मुझे कम से कम 50% सफलता लाने के लिए मेरे अपने कदम :
Clojure 1.3.0 जार फ़ाइल लपेटकर एक नया प्लगइन परियोजना, सेट प्लगइन आईडी
org.clojure.v1.3.0
बनाएं एक नया प्लगइन परियोजना
org.cljtest42
बनाएं का उपयोग कर आरसीपी हैलो टेम्पलेट- जोड़ना
org.clojure
प्लगइन निर्भरता - सीसीडब्ल्यू परियोजना प्रकृति (AOT संकलन सक्षम करने के लिए) को जोड़ने, तो इस चरण
/classes
फ़ोल्डर - संपादित
plugin.xml
/classes
फ़ोल्डर जोड़ने classpath क्रम को भी निर्यात किया संकुल कोorg.cljtest42
जोड़ने के लिए कहते हैं। का चयन करके(ns org.cljtest42.compile) (dorun (map compile ['org.cljtest42.TestClass]))
उत्प्रेरक AOT संकलन
(ns org.cljtest42.TestClass (:gen-class)) (defn -main [greet] (println greet))
compile.clj:
- जोड़ना
org.cljtest42
पैकेज/नाम स्थान में दो सरल Clojure फ़ाइलें जोड़ें:TestClass.clj प्रोजेक्ट नोड और रन> क्लोजर एप्लिकेशन (चुनेंफ़ोल्डर अब संकलित क्लोजर कक्षाओं के साथ आबादी होनी चाहिए)।
संदर्भ TestClass
Activator
वर्ग से (उदाहरण के लिए शुरू में() - यह भी Perspective.createInitialLayout में करने की कोशिश की())
अब तक तो अच्छा। हालांकि, इस परियोजना को चलाने के लिए कोशिश कर रहा एक ग्रहण आवेदन हमेशा इस के साथ विफल के रूप में:
java.io.FileNotFoundException: Could not locate org/cljtest42/TestClass__init.class or org/cljtest42/TestClass.clj on classpath:
at clojure.lang.RT.load(RT.java:430)
at clojure.lang.RT.load(RT.java:398)
at clojure.core$load$fn__4610.invoke(core.clj:5386)
at clojure.core$load.doInvoke(core.clj:5385)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:401)
at com.pspctclr.cljtest42.TestClass.<clinit>(Unknown Source)
यह बकाया हो सकता है अगर किसी को अधिक जानकार इस समस्या को दूर किया जा सकता है पर कुछ संकेत का हिस्सा हो सकता है। यह हो सकता है कि यह क्योंकि या तो AOT संकलित वर्गों वास्तव में classpath में न करना पड़े (यकीन नहीं क्यों ?,/वर्गों स्पष्ट रूप से जोड़ा जाता है) या अलग Clojure प्लगइन उन्हें कारण रास्ता विषुव/OSGi को एक्सेस नहीं कर सकता है कि काम करता है?
धन्यवाद!
यह काम करता है। यहां कुछ अतिरिक्त नोट्स दिए गए हैं। 1) अपने क्लोजर रनटाइम प्लगइन में, आपको जार में सभी पैकेज निर्यात करना होगा। 2) आपको शायद रनटाइम प्लगइन में 'एक्लिप्स-बडी पॉलिसी: पंजीकृत' और फिर निर्भर प्लगइन में संबंधित 'ग्रहण-रजिस्टरबड्डी' प्रविष्टि का उपयोग करना चाहिए। 3) यदि आपकी आश्रित प्लगइन को अन्य प्लगइन द्वारा बुलाया जाता है जो सीधे आपके क्लोजर रनटाइम प्लगइन पर निर्भर नहीं होते हैं, तो आपकी निर्भर प्लगइन को क्लोजर रनटाइम निर्भरता का पुन: निर्यात करना होगा। – Bill
यह शायद एक अच्छा पर्याप्त कामकाज है, लेकिन ऐसा करने का उचित तरीका क्लोजर एओटी के लिए वास्तव में बंडल में आवश्यक आयात को इंजेक्ट करने के लिए है, इसलिए आपको ग्रहण मित्रों का उपयोग करने की आवश्यकता नहीं है क्योंकि यह ओएसजीआई विनिर्देश के आसपास जा रहा है। लेकिन क्लोजर एओटी को सही काम करने की आवश्यकता होगी। –
यह अनुमान लगाता है कि आप अपने क्लोजर कोड को एओटी करने के इच्छुक हैं। – Bill