2013-06-05 3 views
15

मैं ओएसजीआई बंडलों में बंडल-क्लासपाथ के लिए इच्छित उपयोग केस को समझने की कोशिश कर रहा हूं।ओएसजीआई बंडलों में बंडल-क्लासपाथ के लिए इच्छित उपयोग केस क्या है

मेरी समझ है, कृपया यह समझने में मेरी सहायता करें कि यह सही है या नहीं।

मान लें कि मैं एक ओएसजीआई बंडल बनाने पर काम कर रहा हूं जो अन्य बंडलों के पारिस्थितिकी तंत्र में तैनात किया जाएगा। जिस बंडल पर मैं काम कर रहा हूं, उसे कुछ अन्य बंडलों की जरूरत है, लेकिन इन पारिस्थितिकी तंत्र में उन्हें लोड/निर्यात नहीं किया गया है, और मेरे पास पारिस्थितिकी तंत्र के निर्यात पर नियंत्रण नहीं है। ऐसे परिदृश्य में, मैं इन बंडलों को कुछ निर्देशिका के अंदर रख सकता हूं ('lib' कहें) जो मेरे बंडल का हिस्सा बन जाता है। इन बंडलों को बंडल-क्लासपाथ से भी संदर्भित किया जाना चाहिए, ताकि उन्हें लोड किया जा सके।

  • क्या यह बंडल-क्लासपाथ के लिए सही उपयोग केस है?
  • क्या ये अतिरिक्त बंडल ओएसजीआई कंटेनर में भी लोड किए जाएंगे और उनके द्वारा निर्यात किए गए पैकेज अन्य बंडलों के लिए उपलब्ध होंगे?

उत्तर

31

Bundle-ClassPath हमारे बंडल में निर्भरताओं को शामिल करने के लिए है, ताकि हमारे बंडल को स्टैंडअलोन पर तैनात किया जा सके।

चलो एक उदाहरण लें। मान लीजिए कि मेरे बंडल में कोड लाइब्रेरी का उपयोग करता है, उदा। Google गुवा मेरे पास बंडल पैकेजिंग के लिए दो विकल्प हैं:

  1. बस मेरे बंडल को इसके अंदर केवल अपने कोड के साथ बनाएं। बंडल में अब Import-Package बयान होंगे जो गुवा पर निर्भरता घोषित करेंगे, और कोई भी जो मेरे आवेदन में अपने बंडल को तैनात करना चाहता है उसे भी अमरूद को तैनात करना होगा।

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

इन दो विकल्पों के बीच चुनाव एक व्यापार-बंद है। विकल्प 2 का लाभ यह है कि मेरा बंडल तैनात करना आसान है क्योंकि यह स्टैंडअलोन है - इसके लिए आवश्यक सब कुछ ठीक है। दूसरी तरफ, मेरा बंडल जितना बड़ा होना चाहिए उससे बड़ा है, जो कि कई अन्य बंडल भी गुवा की अपनी प्रतिलिपि एम्बेड करते हैं, जो एक समस्या बन सकती है।

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

तो, आपको सावधान रहना चाहिए कि Bundle-ClassPath/Embed-Dependency पर अधिक उपयोग न करें। आपको केवल इसका उपयोग करने पर विचार करना चाहिए यदि निर्भरता (ए) छोटी है, और कोई संक्रमणीय निर्भरता नहीं है, और (बी) आपका बंडल लाइब्रेरी का आंतरिक कार्यान्वयन विवरण के रूप में उपयोग करता है, यानी यह आपके सार्वजनिक एपीआई का हिस्सा नहीं है।

अद्यतन

मैं निर्यात के बारे में अपने दूसरे सवाल का जवाब देने भूल गया। जवाब नहीं है, आपके Bundle-ClassPath पर रखे गए किसी भी "बंडल" के निर्यात आपके स्वयं के बंडल का निर्यात नहीं बनेंगे। असल में जिन जारों को हम Bundle-ClassPath पर डालते हैं उन्हें बंडलों के रूप में नहीं माना जाता है, वे सिर्फ जार हैं।

आप अपने Bundle-ClassPath पर जेएआर के भीतर आने वाले पैकेज निर्यात करना चुन सकते हैं लेकिन आपको इसे अपने स्वयं के बंडल के MANIFEST.MF में करना होगा।

+0

धन्यवाद एक टन!सिर्फ स्पष्टीकरण मैं देख रहा था :-) – Parag

2

मुझे लगता है कि आप यहां थोड़ा सा हो सकते हैं।

एक बंडल-क्लासपाथ रिश्तेदार बंडल JAR फ़ाइल स्थानों में से एक का आदेश दिया, अल्पविराम से अलग किए वर्ग के लिए खोज की है और अनुरोध संसाधन जा रहा है।

क्या इसका मतलब यह है कि जब कुछ बंडल वर्ग एक ही बंडल में अन्य वर्ग की जरूरत है, जिसमें बंडल के पूरे बंडल वर्ग पथ वर्ग को खोजने के लिए खोज कर रहा है।

OSGI in Action से।

चलिए एक ठोस मामले पर विचार करें। निम्नलिखित संरचना के साथ एक बंडल (जार फ़ाइल) कल्पना कीजिए:

src/a/A.class 
src2/b/B.class 
src3/c/C.class 

अगर आप a.A, b.B और c.C एक दूसरे के लिए उपलब्ध होना चाहते थे, तो आप बंडल से संबंधित के रूप में src, src2 और src3 परिभाषित करने के लिए होगा classpath। यही कारण है कि मतलब होगा आप अपने मैनिफ़ेस्ट फ़ाइल में निम्नलिखित पंक्ति जोड़ने के लिए चाहते हैं:

Bundle-ClassPath: src,src2,src3 
2

इस हेडर के लिए सबसे अधिक आम उपयोग बाहरी पुस्तकालयों की पैकेजिंग है। मान लीजिए कि आपके पास कुछ लाइब्रेरी foo.jar है, और अपने बंडल में अपनी कक्षाओं का उपयोग करना चाहते हैं।

तुम इतनी तरह अपने बंडल में जार रखा,

/ 
    com/company/Activator.class 
    foo.jar 
    META-INF/MANIFEST.MF 

आप में प्रकट, अब आप उपयोग कर सकते हैं

Bundle-ClassPath: foo.jar,. 

classpath पर . शामिल करना न भूलें, या आप नहीं होगा अपने बंडल में कक्षाओं को खोजने में सक्षम।

जब कक्षाएं Bundle-ClassPath पर हैं, तो आप उन्हें किसी भी अन्य वर्ग की तरह उपयोग कर सकते हैं: उन्हें अपने कोड में उपयोग करें, या उन्हें निर्यात करें।

+0

जब मैंने बंडल-क्लासपाथ पर एक जार (गैर ओजीआई) लगाया, तो क्या मुझे अपने आयात-पैकेज स्टेटमेंट में आयात करने वाले वर्गों को शामिल करना होगा? – Parag

+0

नहीं: कक्षाओं का ठीक उसी तरह व्यवहार किया जाता है जैसे आपके बंडल में कोई अन्य। –

+0

धन्यवाद, तो मुझे लगता है कि यह मेवेन बंडल प्लगइन होना चाहिए जो मुझे जार – Parag

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

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