2011-02-08 7 views
12

क्या ओएसजीआई एप्लिकेशन के साथ गैर-ओएसजीआई लाइब्रेरी का उपयोग करना संभव है?ओएसजीआई अनुप्रयोग में गैर-ओएसजी लाइब्रेरी उपयोग

उदाहरण के लिए, मैं एक अर्थपूर्ण आधारित खोज इंजन विकसित कर रहा हूं, और मैं इसके लिए एक तीसरी पार्टी प्राकृतिक भाषा प्रसंस्करण पुस्तकालय (http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor) का उपयोग कर रहा हूं।

क्या ऐसी लाइब्रेरी को इंटरफ़ेस करना संभव है जो ओएसजीआई को मेरे ओएसजीआई एप्लिकेशन के साथ दो जार फ़ाइलों के रूप में नहीं ढूंढता है?

उत्तर

22

के रूप में यह पिछले जवाब में लिखा गया था आपके पास दो विकल्प है कि आप अपने बंडलों में अतिरिक्त पुस्तकालयों का उपयोग करना चाहते हैं:

  1. एक बंडल जिसमें यह उपयोग किया जाएगा में पुस्तकालय जार embedding,
  2. एक बनाने लाइब्रेरी से वैध ओएसजीआई बंडल।

पहले दृष्टिकोण सरल क्योंकि आप केवल (एक रूट निर्देशिका में जैसे) एक बंडल के लिए पुस्तकालय जार (और उसके सभी निर्भरता) की प्रतिलिपि और फिर MANIFEST.MF में Bundle-Classpath तत्व में शामिल करें (here देखें) करने की जरूरत है । हालांकि, ऐसा करने के दौरान आपको याद रखना चाहिए कि यह अतिरिक्त लाइब्रेरी केवल उस बंडल में दिखाई देगी जिसमें इसे एम्बेड किया गया है (इसलिए लाइब्रेरी पुन: उपयोग सीमित है)। MANIFEST.MF में अन्य बंडलों के लिए दृश्यमान बनाने के लिए आप हमेशा इस लाइब्रेरी से संकुल Export-package तत्व में जोड़ सकते हैं लेकिन यह सुरुचिपूर्ण समाधान से दूर है (हालांकि यह काम करेगा)।

इसे अन्य बंडलों आप दूसरा दृष्टिकोण, अर्थात का उपयोग करना चाहिए पुस्तकालय से एक OSGi बंडल बनाने के लिए दृश्यमान बनाने के लिए में (वहाँ उपकरण है जो आपको लगता है कि ऐसा करने में मदद कर सकते हैं, यह भी ग्रहण कर रहे हैं)। हालांकि, अधिक जटिल पुस्तकालयों के लिए यह दृष्टिकोण कठिन हो सकता है (ओएसजीआई में निर्भरता और विशिष्ट वर्ग लोडिंग दृष्टिकोण की वजह से)।

तो यदि आप केवल एक बंडल में लाइब्रेरी का उपयोग करना चाहते हैं तो मैं पहले दृष्टिकोण का उपयोग करने का सुझाव देता हूं (इसे कार्यान्वित करना आसान है)। यदि आप इस पुस्तकालय का उपयोग अपने आवेदन में कई बंडलों में करना चाहते हैं तो आपको दूसरे दृष्टिकोण पर विचार करना चाहिए।

3

हां, यह संभव है। आपके पास दो विकल्प हैं:

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

5

हां, आप या तो अपने बंडल या रैप ("ओएसजीआईएफआई") में बाहरी लाइब्रेरी को ओएसजीआई बंडल के रूप में एम्बेड कर सकते हैं। दोनों विकल्पों के लिए, पैक्स कन्स्ट्रक्ट (http://www.ops4j.org/projects/pax/construct) एक अच्छा टूल है।

यदि आपकी बाहरी लाइब्रेरी में निर्भरताएं हैं, तो इन सभी को एक बंडल में एम्बेड करें या उन्हें ट्रांसफ़ॉर्मेट करने के लिए पैक्स कन्स्ट्रक्ट का उपयोग करें।

यदि रैपिंग या एम्बेडिंग के बीच चयन करना है, तो निर्भरता प्रबंधन और बंडलों के संस्करण पर विचार करें। यदि आपको बाहरी लाइब्रेरी को अपग्रेड करना है और यह आपके अपने एप्लिकेशन बंडल में एम्बेड किया गया है, तो आप हमेशा लाइब्रेरी और अपना कोड दोनों जारी करते हैं। यह आपके अनुप्रयोग बंडल सक्रिय के 2 संस्करण के बिना सक्रिय पुस्तकालय के 2 संस्करण भी संभव नहीं है। और यह भी ... यदि आप ओएसजीआई पर्यावरण में काम नहीं कर रहे हैं, तो क्या आप अपने आवेदन जार में तृतीय-पक्ष कक्षाएं जोड़ना चाहेंगे? तो ओएसजीआई पर्यावरण में ऐसा क्यों करें?

मैं व्यक्तिगत रूप से ब्लैक बॉक्स के रूप में बाहरी lib को देखने के लिए इस तरह के मामले में पसंद करता हूं, और पुस्तकालय और इसकी निर्भरता को एक बंडल में लपेटता हूं।

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