2014-12-24 10 views
5

मेरे पास एक मालिकाना निर्भरता है जिसका उपयोग मैं अपने प्रोजेक्ट में करता हूं जिसे मैं मना नहीं कर सकता। यह एक बड़े वसा जार में बनाया गया था जिसमें सभी निर्भर पैकेज शामिल थे। मेरा मतलब है कि slf4j-api, apache-commons, javax संकुल आदि जैसे सामान्य भी हैंवसा जार निर्भरता से निपटने के लिए कैसे करें

घोषित निर्भरताओं की अपनी सूची के साथ इसका उपयोग करना जोखिम भरा है क्योंकि क्लासलोडर में हमेशा एक दौड़ होती है जिस पर कक्षा लोड की जाएगी पहला - वसा जार के अंदर मेरा या पुराना वर्ग।

मुझे आश्चर्य था कि इस समस्या के आसपास कोई रास्ता है? ऐसे वसा जार का इलाज कैसे करें? मैं निर्भरता प्रबंधन के लिए मेवेन का उपयोग कर रहा हूँ।

+1

दोष का उपयोग कर इस पुस्तकालय की कक्षाओं का दृष्टांत होगा उन लोगों को इस तरह की सामग्री के साथ एक वसा जार का कारण बना सकते हैं करता है वास्तव में समझ में नहीं आता (कॉमन्स इत्यादि)। यह हमेशा वर्गीकरण समस्याओं का कारण बन जाएगा। तो आपको स्वयं निर्मित जार बनाए रखना होगा .... अन्यथा आप खो गए हैं ... – khmarbaise

+1

@khmarbaise ओह, मैं उन्हें हर दिन दोषी ठहरा रहा हूं, लेकिन इसकी मदद नहीं कर रहा है। वे अपने पैकेज वितरण के बारे में कुछ भी नहीं करेंगे। निश्चित रूप से निकट भविष्य में नहीं। – SimY4

उत्तर

1

मुझे लगता है कि एक और तरीका है। मैं अपने स्वयं के कस्टम classloader

URLClassLoader c1 = new URLClassLoader(new Url[] { new URL("file:lib/fatJarDep.jar"}); 

में इस लाइब्रेरी जार लपेट और एक कारखाने कि इस पृथक classloader

Class.forName("className", true, c1); 
1

यदि जार में आपके भीतर निकाली गई सभी निर्भरता वर्ग को क्लासलोडिंग से बाहर नहीं किया जा सकता है, तो आपकी परियोजना में समान निर्भरता संघर्ष कर सकती है।

आपको वसा जार संपादित करना चाहिए और प्रकाश संस्करण बनाने के लिए कक्षाओं को मैन्युअल रूप से हटा देना चाहिए, फिर इसे अपने रेपो में इंस्टॉल करें और इसे अपने पोम में देखें।

+1

मुझे किसी तृतीय पक्ष प्रोजेक्ट का समर्थन करने की सांस लेने की आवश्यकता नहीं है। इस पुस्तकालय के कस्टम निर्माण को मुझे मुख्य स्रोत से बैकपोर्ट पैच और नई रिलीज के लिए समय लगेगा। – SimY4

+1

आप एक साधारण प्रक्रिया लिख ​​सकते हैं जो आपके द्वारा संस्करण अद्यतन पर चलने वाले पतले जार को बनाती है। मुझे लगता है कि आप नए जार रिलीज पर मैन्युअल रूप से पोम अपडेट करते हैं, प्रक्रिया नए संस्करण को इनपुट में ले सकती है, पतली जार बना सकती है और अपना पोम अपडेट कर सकती है – fantarama

+0

क्या आप मुझे इस तरह की सरल प्रक्रिया पर मार्गदर्शन कर सकते हैं? इसे बनाने के बारे में कुछ उदाहरण या लेख दिखाएं? – SimY4

2

मेवेन में, जिस क्रम में आप अपने पीओएम में निर्भरता को परिभाषित करते हैं, वह महत्वपूर्ण है। यदि आप उन्हें सही क्रम में सूचीबद्ध करते हैं, तो उन्हें उस क्रम में जार में जोड़ा जाना चाहिए, और जो भी कक्षा फ़ाइल में अधिक है, वह वह है जो पहले लोड हो जाएगा।

यदि आप अपने रनटाइम क्लासपाथ को कई जारों, से लिखेंगे, तो फिर जार को सही क्रम में डालने का मामला है।

+0

यह किसी समस्या को ठीक नहीं करेगा: इस श्रेणी के आधार पर कि कौन सी कक्षा पहले लोड की जाएगी, आपको इस कोड के आपके कोड गड़बड़ या कोड को एथियर मिलेगा। संभावित वर्ग असंगतता के कारण। (वसा जार के अंदर पुस्तकालयों के संस्करण अज्ञात हैं) – SimY4

1

आप जानते हैं कि वसा जार के कुछ कार्यक्षमताओं जब आप उनके निर्भरता के लिए कुछ बाहर या आप उन्हें अपने आप को शामिल करना चाहते हैं काम करेंगे, तो आप इस कोशिश कर सकते हैं:

  1. एक Maven परियोजना है कि पर निर्भर करता है सुनिश्चित करें वसा जार केवल
  2. maven-shade-plugin का उपयोग करें, विशेष रूप से यह उन पैकेजों को बाहर करने के लिए स्थानान्तरण सुविधा है, जिन्हें आप नहीं चाहते हैं, या बस सभी जार के वर्गों को किसी अन्य पैकेज में स्थानांतरित करने के लिए, और इस प्रकार उन्हें रास्ते से बाहर ले जाएं।
  3. अपनी अन्य परियोजना में वसा प्रोपेटरी जार के बजाय प्रोजेक्ट के आर्टिफैक्ट का उपयोग करें।
+0

सुझाव के लिए धन्यवाद। मैं मैवेन छाया प्लगइन के बारे में नहीं जानता था, मैं कोशिश करूँगा। – SimY4

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