2009-10-12 21 views
19

के विभिन्न संस्करणों का संदर्भ कैसे लें यह एक आम समस्या है। मैं 2 पुस्तकालयों A.jar और B.jar उपयोग कर रहा हूँ और ये एक ही जार के विभिन्न संस्करणों पर निर्भर करते हैं।
मान लीजिए कि रनटाइम पर मैं की जरूरत है कि THIS.xxxjarजावा क्लासलोडर - एक जार

MY.jar 
    -> A.jar -> THIS.1.0.0.jar 
    -> B.jar -> C.jar -> THIS.5.0.0.jar 

मैं अपनी निर्भरता के खिलाफ विशिष्ट जार (A.jar/B.jar) संकलन कर सकते हैं लेकिन कार्यावधि में मैं केवल 1 लोड करने के लिए है संस्करण। कौनसा?
केवल 1 निर्भरता लोड करना (नवीनतम संस्करण) का अर्थ है कि यदि पुस्तकालय पिछड़ा संगत नहीं हैं (क्या वहां पिछड़ा संगत पुस्तकालय हैं?)।

वैसे भी मुझे पता है कि ओएसजीआई जैसी कुछ इस समस्या को ठीक कर सकती है।
मैं सोच रहा हूँ समस्याओं के इस प्रकार तय करने के लिए पुराना तरीका क्या ...

धन्यवाद एक बहुत

+0

क्या यह हासिल करना संभव है? ओएसजीआई कैसे मदद करता है? हम फिर से ओएसजीआई पर एक डिस्पेंसेंसी पेश कर रहे हैं जो ठेठ उत्पाद सॉफ्टवेयर विकास (विशेष रूप से एम्बेडेड के लिए) में एक ओवरहेड है। – sskumar86

उत्तर

7

आपने कहा "पुराना तरीका" (और एक ओएसजीआई निश्चित रूप से हुड के नीचे उपयोग करता है) अपनी निर्भरताओं की दोनों शाखाओं के लिए अपना खुद का क्लासलोडर स्थापित करना है। उदाहरण के लिए, उदाहरण के लिए, एप्लिकेशन सर्वर एक ही अनुप्रयोग के पुराने और नए संस्करणों को एक ही JVM के अंदर चलाने में सक्षम हैं।

क्लासलोडर पदानुक्रम के बारे में पढ़ें।

आपके सेटअप में, मुश्किल हिस्सा संयुक्त बिंदु है, जहां दोनों शाखाओं की कक्षाएं मिलती हैं। न तो शाखाएं किसी दूसरे में लोड कक्षाओं का उपयोग कर सकती हैं। इसे काम करने का तरीका यह सुनिश्चित करना है कि बूट क्लासलोडर (जेआरई कक्षाएं) या MY.jar के क्लासलोडर द्वारा लोड की गई कक्षाएं दोनों शाखाओं में पारित की जाएंगी।

1

कई पुस्तकालयों पिछड़े संगत हैं। लेकिन सभी नहीं ..


पुराना तरीका केवल एक संस्करण से निर्भर करने का प्रयास करना है।

यह संभवतः एक ही संस्करण (नवीनतम) दोनों को संकलित करना सुरक्षित है।
कम से कम आप रनटाइम त्रुटियों के बजाय संकलन-समय त्रुटियां प्राप्त करते हैं।

आवश्यक होने पर आप एक छोटा सा अपने पुस्तकालय है कि पुराने निर्भरता के साथ काम करता ...
इस स्रोत के लिए उपयोग की आवश्यकता होगी ...


कृपया ध्यान दें कि संकलन समय अनुकूलता संशोधित कर सकते हैं सही रनटाइम व्यवहार की गारंटी नहीं देगा। यह एक कदम है, तो आप कर सकते हैं:

  • जार के नए संस्करण के लिए WhatsNew फ़ाइल को पढ़ने
  • उपयोगकर्ताओं
  • लिखने JUnits
  • रिपोर्टिंग संगतता समस्या के लिए इंटरनेट पर
  • नज़र में कोड की तुलना दोनों जार
4

OSGi इस समस्या को ठीक कर सकते हैं। एक ओएसजीआई बंडल अतिरिक्त मेटाडेटा विवरण संस्करणों के साथ एक जार से अधिक कुछ नहीं है। एक बंडल में संस्करण संख्या होती है, और निर्भर जार के विस्तार संस्करण संख्या (या श्रेणियां) होगी।

अधिक जानकारी के लिए this introductory Javaworld article पर एक नज़र डालें।

OSGi मैन्युअल सुनिश्चित करें कि आप संकलन और संगत जार के साथ चलाने के लिए होने का मतलब है बिना इस को हल करने के। जैसा कि आपने पाया है कि यह एक मामूली काम नहीं है। चूंकि जार अपने संस्करणों की जरूरी पहचान नहीं करते हैं, इसलिए चेकसम या हस्ताक्षर रिकॉर्ड/तुलना करने के लिए ऐसा करने का एकमात्र निश्चित तरीका है।

1

जैसा कि केएलई द्वारा उल्लिखित है, डिफ़ॉल्ट दृष्टिकोण नए संस्करण पर निर्भर है। कोई गारंटी नहीं है, लेकिन अधिकांश समय यह काम करता है। शायद सबसे अच्छा तरीका (एक ब्लोटेड होने के दौरान) इसे पाने के लिए ओएसजीआई का उपयोग कर रहा है।

0

एक बुनियादी "oldway" कार्यान्वयन चेकआउट https://github.com/atulsm/ElasticsearchClassLoader

यह एक दृष्टिकोण elasticsearch ग्राहक उपयोग के गैर पिछड़े संगत संस्करणों को संभालने के लिए प्रदान करता है का उल्लेख करने के लिए।

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