2013-07-31 9 views
5

यह मानते हुए कि मैं एंड-यूजर सॉफ्टवेयर प्रोग्राम (उबेरजर के रूप में) विकसित कर रहा हूं, मुझे आश्चर्य है कि उपयोगकर्ता के लिए प्लगइन डाउनलोड करने और रनटाइम के दौरान लोड करने के लिए मेरे विकल्प क्या हैं ।रनटाइम में प्लगइन्स को लोड करने के लिए आर्किटेक्चर

प्लगइन संकलित और स्रोत कोड के बिना आना चाहिए, इसलिए sth। जैसे load एक विकल्प नहीं है। इस पर निर्माण के लिए मौजूदा पुस्तकालय (या जावा के तरीके ...?) मौजूद हैं?

संपादित करें: यदि आप सुनिश्चित नहीं हैं कि मैं इस तरह से भी संतुष्ट हूं कि मुख्य कार्यक्रम के रीबूट/स्टार्ट की लागत है। हालांकि, महत्वपूर्ण बात यह है कि स्रोत कोड को किसी भी जेएआर फ़ाइल में शामिल नहीं किया जाएगा (न तो मुख्य एप्लिकेशन और न ही प्लगइन-जार, देखें: लीनिंगेन दस्तावेज का स्रोत-स्रोत)।

उत्तर

1

मैंने इसे स्वयं नहीं किया है, लेकिन आपको सिद्धांत में क्लोजर के साथ काम करने के लिए OSGi प्राप्त करने में सक्षम होना चाहिए।

एक Clojure/OSGi एकीकरण यहाँ पुस्तकालय नहीं है:

+0

ऐसा लगता है कि ओएसजीआई ऐसा करने का जावा तरीका है। जिथब रेपो वास्तव में खराब दस्तावेज है और स्रोत-कोड पर एक नजर से अत्यधिक हैकिश लगता है। अगर तुलनीय कुछ भी नहीं है तो मैं शायद ओएसजीआई के लिए एक रैपर लिखने जा रहा हूं। –

1

अगर मैं, मैं लोड और अनलोड करने के लिए प्लग-इन का उपयोग कर tools.namespace कोशिश करेगा अपने ही समाधान भूमिका करने के लिए प्रयास करने के लिए थे। मुझे पूरा यकीन नहीं है कि यह काम करेगा, लेकिन यह निश्चित रूप से सही दिशा में है। मुझे लगता है कि एक महत्वपूर्ण टुकड़ा यह है कि प्लगइन जार को उस स्थान पर "स्थापित" होना होगा जो क्लासपाथ पर पहले से ही है।

फिर से, यह केवल एक संभावित समाधान की शुरुआत है। मैंने ऐसा करने की कोशिश नहीं की है।

+0

क्या आप सुनिश्चित हैं कि उपकरण.नामस्पेस.फिंड काम करता है जब स्रोत-कोड JARs में शामिल नहीं होता है? –

+0

मैंने कोशिश नहीं की है, लेकिन README बताता है कि tools.namespace।खोज में "फाइल सिस्टम पर क्लोजर नेमस्पेस की खोज करने के लिए उपयोगिताएं हैं, निर्देशिकाओं या जेएआर फाइलों में। जावा.क्लासपैथ के साथ संयुक्त, यह जावा क्लासपाथ पर नेमस्पेस की खोज कर सकता है।" – Jeremy

+0

दुर्भाग्य से यह स्रोत के बिना जेएआर फाइलों में कोई नामस्थान नहीं ढूंढ सकता :( –

4

रनटाइम के दौरान एक जार जोड़ने के लिए, pomegranate का उपयोग करें जो आपको क्लासपाथ में .jar फ़ाइल जोड़ने देता है। अपने सॉफ़्टवेयर के प्लगइन्स नियमित Clojure libs कि कुछ सम्मेलनों है कि आप स्थापित करने की आवश्यकता का पालन किया जाना चाहिए:

  1. उन्हें प्रदान हो (उदा में एक edn) जैसे Lifecycle एक निर्माता/नाशक तंत्र को लागू करने के लिए एक वस्तु एक प्रतीक स्टुअर्ट सिएरास component लाइब्रेरी में प्रोटोकॉल। रनटाइम में, require और resolve वह प्रतीक, start परिणामस्वरूप ऑब्जेक्ट और इसे अपने प्रोग्राम प्लगइन समन्वय सुविधाओं को आराम करने के लिए इसे सौंप देता है।

  2. अपने प्रोग्राम में एक सार्वजनिक एपीआई प्रदान करें जो प्लगइन्स को इस तरह से बातचीत करने की अनुमति देता है कि आप अतुल्यकालिक रूप से समन्वयित करते हैं। जी। clojure.core.async के साथ (एक प्लगइन को पूरे कार्यक्रम को अवरुद्ध न करें)।

  3. सुनिश्चित करें कि प्लगइन्स एक-दूसरे के लिए अपनी कार्यक्षमता का पर्दाफाश करने के लिए एक समन्वित तरीका है, यदि वे आपके प्लगइन के बीच उच्च स्तर की मॉड्यूलरिटी सक्षम करने के लिए चाहते हैं। सुनिश्चित करें कि आपका प्लगइन लोडर प्लगइन के बीच निर्भरताओं का पता लगाने में सक्षम है और सही क्रम में उन्हें लोड और अनलोड करने में सक्षम है।

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