2010-01-19 9 views
7

में लाइब्रेरी के कई संस्करणों पर निर्भरता प्रबंधन करना ग्रहण पर्यावरण में मेरे पास प्रोजेक्ट ए है। परियोजनाओं या पुस्तकालयों बी और सी के लिए निर्भरता है (यदि वे परियोजनाएं या पुस्तकालय हैं तो कोई फर्क नहीं पड़ता) बी LibX.v1 और सी पर निर्भरता है LibX.v2 पर निर्भरता है। रनटाइम के दौरान, ए को बीजर और सीजर की आवश्यकता होगी। इसके अलावा बीजर में कक्षाओं को लिबरएक्स.वी 1 और सीजर में कक्षाओं की आवश्यकता होगी, उन्हें LibX.v2 की आवश्यकता होगी। ही पुस्तकालय के विभिन्न संस्करणों के होने के नाते, LibX.v1 और LibX.v2, एक ही वर्ग हैं, तो यह संभव है कि एक वर्ग क्रम में पुस्तकालय के गलत संस्करण से लोड किया जा सकता है, मुसीबत के बहुत सारे कारण। मैं इस तरह की स्थितियों का प्रबंधन कैसे करूं?जावा और ग्रहण

तरह का संबंध सेरेफ़

+1

एक सलाह - OSGi में नहीं जाते जब तक आप आप इसे संभाल कर सकते हैं पूरी तरह से कुछ कर रहे हैं। यह सिर्फ "निर्भरताओं के कई संस्करणों" से अधिक है – Bozho

उत्तर

4

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

संपादित करें: वास्तव में, मुझे कुछ ऐसा मिला जो आपकी मदद कर सकता है। इसे ओएसजीआई कहा जाता है, और मैंने इसका उपयोग नहीं किया है, लेकिन ऐसा लगता है जैसे आप ऐसा करने की कोशिश कर रहे हैं। एक परिचय लेख में link है।

+0

वास्तव में ओएसजीआई एकमात्र तरीका प्रतीत होता है। यदि आप ओपन सोर्स प्रोजेक्ट्स पर काम कर रहे हैं तो यह एक बहुत ही लगातार मुद्दा है। मुझे लगता है कि मैं ओएसजीआई पर गंभीरता से काम करूँगा। धन्यवाद! (असल में मैं यह कहने के लिए जा रहा था कि मुझे यह मिला: http://stackoverflow.com/questions/1553567/java-classloader-how-to-reference-different-versions-of-a-jar) सम्मान सेरेफ़ – mahonya

+0

प्रथम श्रेणी classpath पर पाया ही नाम के साथ किसी भी अधिक कक्षाओं लोड हो रहा है, यह एक गारंटी के रूप में देखा जा सकता है से JVM बंद कर देंगे? –

3

आप एक 'कई classloader' तंत्र (जो क्या OSGi करने में सक्षम है) का उपयोग करना होगा। ऐसे परिदृश्य में कक्षा बी के लिए क्लासलोडर केवल LibX.v1 देख सकता है, जबकि क्लासलोडर सी केवल LibX.v2 देखता है। आप इसे OSGi साथ यह कर सकते हैं, लेकिन OSGi इस से कहीं अधिक है और इसके साथ आरंभ करने के लिए तुच्छ नहीं है।

एक और प्लग-इन फ्रेमवर्क JPF है, जो कि एकाधिक क्लासलोडर्स का उपयोग करने से भी अधिक प्रदान करता है। मुझे लगता है कि वे दोनों 1 क्लासलोडर प्रति प्लग-इन (मॉड्यूल, जो कुछ भी ...)

शायद classworlds पर एक नज़र डालें। मुझे लगता है कि इस पुस्तकालय के साथ ऐसा करना संभव है। लाभ यह है कि यह क्लासलोडिंग पहलू पर केंद्रित है। दस्तावेज इतना अच्छा नहीं है। क्लासवर्ल्ड क्लास क्षेत्र की धारणा का उपयोग करता है। साइट पर एपीआई उपयोग उदाहरण पर एक नज़र डालें। यदि मैं एक पाता हूं तो मैं यहां एक उदाहरण जोड़ूंगा। वैसे भी, इस के लिए कोई तुच्छ समाधान मुझे लगता है कि

निश्चित रूप से सबसे अच्छा समाधान है निर्भरता प्रबंधन के साथ इसे सुलझाने, लेकिन यह हमेशा संभव नहीं है।

+0

हाय, जेपीएफ पॉइंटर के लिए धन्यवाद, मैं इसे देख रहा हूं। इस मामले में मेरे पास बहुत पसंद नहीं है। मेरे पास पुस्तकालयों को एक ही पुस्तकालयों के विभिन्न संस्करणों के संदर्भ के साथ हाथ में है। यदि आप निर्भरता प्रबंधन के साथ अपने मतलब में कुछ अंतर्दृष्टि दे सकते हैं तो मैं सराहना करता हूं। तरह सेरेफ़ – mahonya

+0

मूल रूप से, निर्भरता प्रबंधन आप (कॉन्फ़िगर) घोषित करने के लिए पुस्तकालयों अपनी परियोजना पर निर्भर करता है की अनुमति देता है संबंध है।अधिक जानकारी के लिए 'मेवेन' या 'ivy' पर एक खोज करें। आप अपनी परियोजना और उनकी निर्भरताओं का प्रबंधन कैसे करते हैं, क्या आपके पास ग्रहण परियोजनाओं में जार का संग्रह है? भी, क्या एक विशिष्ट कारण है कि दोनों परियोजनाओं को लिबक्स के एक अलग संस्करण का उपयोग क्यों करना चाहिए? यदि नहीं, तो आप अपनी समस्या को आइवी या मेवेन के साथ हल कर सकते हैं क्योंकि लिबक्स के केवल 1 संस्करण का उपयोग करना संभव है और दूसरे को छोड़ दें। –

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