2011-11-05 16 views
5

(मुझे पता है यह How can I embed Clojure in an RCP application से संबंधित है, लेकिन है कि धागा पुरानी है और मेरी सेटअप कुछ अलग है)Clojure classpath मुद्दा

मैं ग्रहण 3.7.1 का उपयोग कर रहा है और दिनों के लिए अब है Clojure (जितना संभव हो सके) में एक ग्रहण/आरसीपी ऐप लिखने की कोशिश कर रहा है। मैं clojure.osgi और CCW के स्रोत संस्करण बनाने की कोशिश की, RCPClojure डेमो परियोजना और कई अन्य चीजों की कोशिश की है है। उनमें से प्रत्येक ने काम नहीं किया (मुख्य रूप से प्रतीत होता है "अपरिवर्तनीय" बिल्ड/क्लासपाथ त्रुटियों, अप-टू-डेट दस्तावेज़/प्रतिक्रिया, संस्करण विवाद आदि की कमी ...)

मुझे कम से कम 50% सफलता लाने के लिए मेरे अपने कदम :

  1. Clojure 1.3.0 जार फ़ाइल लपेटकर एक नया प्लगइन परियोजना, सेट प्लगइन आईडी org.clojure.v1.3.0

  2. बनाएं एक नया प्लगइन परियोजना org.cljtest42 बनाएं का उपयोग कर आरसीपी हैलो टेम्पलेट

    1. जोड़ना org.clojure प्लगइन निर्भरता
    2. सीसीडब्ल्यू परियोजना प्रकृति (AOT संकलन सक्षम करने के लिए) को जोड़ने, तो इस चरण /classes फ़ोल्डर
    3. संपादित plugin.xml/classes फ़ोल्डर जोड़ने classpath क्रम को भी निर्यात किया संकुल को org.cljtest42 जोड़ने के लिए कहते हैं। का चयन करके

      (ns org.cljtest42.compile) 
      (dorun (map compile ['org.cljtest42.TestClass])) 
      
    4. उत्प्रेरक AOT संकलन

      (ns org.cljtest42.TestClass 
      (:gen-class)) 
      
      (defn -main [greet] (println greet)) 
      

      compile.clj:

  3. org.cljtest42 पैकेज/नाम स्थान में दो सरल Clojure फ़ाइलें जोड़ें:

    TestClass.clj प्रोजेक्ट नोड और रन> क्लोजर एप्लिकेशन (चुनेंफ़ोल्डर अब संकलित क्लोजर कक्षाओं के साथ आबादी होनी चाहिए)।

  4. संदर्भ 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

समस्या लगता है कि Clojure बंडल अपने बंडल की कक्षाओं को नहीं देखती है, हालांकि आप उन्हें निर्यात किया है। यह, क्योंकि OSGi (जैसा कि आप शायद जानते हैं) में, क्रम में एक बंडल एक वर्ग को देखने के लिए सक्षम होने के लिए के लिए में, अपने पैकेज आयातित किए जाने की आवश्यकता है।

लेकिन मामलों के बारे में क्या, जहां एक बंडल को एक बंडल से कक्षा लोड करने की आवश्यकता होती है, जिसे इसे कहा जाता है। आदेश में इस काम के लिए, ग्रहण buddy policies है, जो वास्तव में इस मामले के लिए तैयार कर रहे हैं लागू किया गया है:

  1. आपका Clojure बंडल प्रकट हैडर Eclipse-BuddyPolicy: [dependent|registered] की जरूरत है। Eclipse-RegisterBuddy: <clojure-bundle-name>

अस्वीकरण::

  • आप Eclipse-BuddyPolicy: registered जोड़ दिया है, तो आप बंडलों, जो Clojure का उपयोग करता है करने के लिए प्रकट शीर्ष लेख जोड़ने की आवश्यकता होगी मैं Clojure के साथ कोई अनुभव नहीं है, लेकिन मैं ले जाना चाहते थे इस पर एक शॉट

  • +0

    यह काम करता है। यहां कुछ अतिरिक्त नोट्स दिए गए हैं। 1) अपने क्लोजर रनटाइम प्लगइन में, आपको जार में सभी पैकेज निर्यात करना होगा। 2) आपको शायद रनटाइम प्लगइन में 'एक्लिप्स-बडी पॉलिसी: पंजीकृत' और फिर निर्भर प्लगइन में संबंधित 'ग्रहण-रजिस्टरबड्डी' प्रविष्टि का उपयोग करना चाहिए। 3) यदि आपकी आश्रित प्लगइन को अन्य प्लगइन द्वारा बुलाया जाता है जो सीधे आपके क्लोजर रनटाइम प्लगइन पर निर्भर नहीं होते हैं, तो आपकी निर्भर प्लगइन को क्लोजर रनटाइम निर्भरता का पुन: निर्यात करना होगा। – Bill

    +0

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

    +0

    यह अनुमान लगाता है कि आप अपने क्लोजर कोड को एओटी करने के इच्छुक हैं। – Bill