क्या जावा को निर्दिष्ट करना संभव classpath
है जिसमें एक JAR फाइल शामिल है जो एक अन्य JAR फाइल के भीतर है?
क्या जावा को निर्दिष्ट करना संभव classpath
है जिसमें एक JAR फाइल शामिल है जो एक अन्य JAR फाइल के भीतर है?
जवाबों:
यदि आप एक एकल जार बनाने की कोशिश कर रहे हैं जिसमें आपका एप्लिकेशन और इसकी आवश्यक लाइब्रेरी शामिल हैं, तो ऐसा करने के दो तरीके हैं (जो मुझे पता है)। पहला वन-जार है , जो जार के नेस्टिंग की अनुमति देने के लिए एक विशेष क्लास लोडर का उपयोग करता है। दूसरा UberJar , या Shade है ) है, जिसमें शामिल लाइब्रेरीज़ में विस्फोट होता है और सभी कक्षाओं को शीर्ष-स्तरीय जार में रखा जाता है।
मुझे यह भी उल्लेख करना चाहिए कि UberJar और Shade क्रमशः Maven1 और Maven2 के लिए प्लगइन्स हैं। जैसा कि नीचे उल्लेख किया गया है, आप असेंबली प्लगइन का उपयोग भी कर सकते हैं (जो वास्तव में बहुत अधिक शक्तिशाली है, लेकिन ठीक से कॉन्फ़िगर करने के लिए बहुत कठिन है)।
आप उन "JAR सामग्री विस्फोट" समाधान का उपयोग नहीं करना चाहते हैं। वे निश्चित रूप से सामान को देखना कठिन बनाते हैं (चूंकि सब कुछ एक ही स्तर पर विस्फोट हो जाता है)। इसके अलावा, नामकरण संघर्ष हो सकता है (ऐसा नहीं होना चाहिए अगर लोग उचित पैकेज का उपयोग करते हैं, लेकिन आप हमेशा इसे नियंत्रित नहीं कर सकते हैं)।
जो सुविधा आप चाहते हैं, वह शीर्ष 25 Sun RFEs में से एक है : RFE 4648386 , जिसे सूर्य, उनके अनंत ज्ञान में, निम्न प्राथमिकता के रूप में नामित किया गया है। हम केवल आशा कर सकते हैं कि सूर्य जाग जाए ...
इस बीच, सबसे अच्छा समाधान जो मुझे आया है (जो मैं चाहता हूं कि सूर्य जेडीके में कॉपी होगा) कस्टम क्लास लोडर जारक्लासलाडर का उपयोग करना है ।
activation.jar
)।
कुछ शोध के बाद मुझे ऐसी विधि मिली है जिसमें मावेन या किसी तीसरे पक्ष के विस्तार / कार्यक्रम की आवश्यकता नहीं है।
आप अपनी अभिव्यक्ति फ़ाइल में "क्लास-पाथ" का उपयोग कर सकते हैं।
उदाहरण के लिए:
मैनिफ़ेस्ट फ़ाइल बनाएँ MANIFEST.MF
Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass
अपनी सभी कक्षाओं को संकलित करें और चलाएं jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar
c
संग्रह बनाने के लिए खड़ा है
f
इंगित करता है कि आप फ़ाइल निर्दिष्ट करना चाहते हैं
v
वर्बोज़ इनपुट के लिए
m
इसका मतलब है कि हम कस्टम मैनिफ़ेस्ट फ़ाइल पास करेंगे
सुनिश्चित करें कि आपने जार पैकेज में लिब को शामिल किया है। आपको सामान्य तरीके से जार चलाने में सक्षम होना चाहिए।
इसके आधार पर: http://www.ibm.com/developerworks/library/j-5things6/
आपके द्वारा यहां खोजे जाने वाले वर्ग-पथ के बारे में अन्य सभी जानकारी की आवश्यकता है
custom_lib.jar
गया, तो जार अब निष्पादित नहीं किया जा सकता है :(
Zipgroupfileset टैग का उपयोग करें (एक fileset टैग के रूप में एक ही गुण का उपयोग करता है ); यह निर्देशिका में सभी फ़ाइलों को अनज़िप करेगा और आपकी नई संग्रह फ़ाइल में जोड़ देगा। अधिक जानकारी: http://ant.apache.org/manual/Tasks/zip.html
जार-ए-जार समस्या के आसपास पाने के लिए यह एक बहुत ही उपयोगी तरीका है - मुझे पता है क्योंकि मैंने इस सटीक स्टैकऑवरफ्लो प्रश्न को हल कर दिया है जबकि यह जानने की कोशिश कर रहा हूं कि क्या करना है। यदि आप चींटी या जार के एक फ़ोल्डर को चींटी के साथ अपने एक निर्मित जार में पैकेज करना चाहते हैं, तो यह सब क्लासपाथ या थर्ड-पार्टी प्लगइन सामान के बारे में भूल जाएं, आपको बस इतना करना होगा (चींटी में):
<jar destfile="your.jar" basedir="java/dir">
...
<zipgroupfileset dir="dir/of/jars" />
</jar>
यदि आप चींटी के साथ निर्माण कर रहे हैं (मैं ग्रहण से चींटी का उपयोग कर रहा हूं), तो आप उन्हें जोड़ने के लिए चींटी को कहकर अतिरिक्त जार फ़ाइलों को जोड़ सकते हैं ... जरूरी नहीं कि यदि आपके पास कई लोगों द्वारा बनाई गई परियोजना है, तो सबसे अच्छी विधि है लेकिन यह काम करती है एक व्यक्ति परियोजना के लिए और आसान है।
उदाहरण के लिए मेरा .jar फ़ाइल बनाने वाला लक्ष्य था:
<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
<manifest>
<attribute name="Author" value="ntg"/>
................................
<attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
</manifest>
</jar>
मैंने इसे बनाने के लिए सिर्फ एक लाइन जोड़ी:
<jar ....">
<zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
<manifest>
................................
</manifest>
</jar>
कहाँ पे
<property name="external-lib-dir"
value="C:\...\eclipseWorkspace\Filter\external\...\lib" />
बाहरी जार के साथ dir था। और बस...
मैं अपने जावा बिल्ड के लिए मावेन का उपयोग करता हूं जिसमें एक प्लगइन होता है जिसे मावेन असेंबली प्लगइन कहा जाता है ।
यह आपके पूछने पर क्या करता है, लेकिन कुछ अन्य सुझावों का वर्णन है - अनिवार्य रूप से सभी आश्रित जार को विस्फोट करना और उन्हें एक जार में पुन: संयोजित करना
Winstone बहुत अच्छा है http://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/ । लेकिन जटिल साइटों के लिए नहीं। और यह एक शर्म की बात है क्योंकि सभी इसे शामिल करने के लिए प्लगइन शामिल है।
यदि आप ग्रहण का उपयोग कर रहे हैं, तो एक बहुत ही आसान तरीका है।
अपनी परियोजना को "रननेबल" जार फ़ाइल के रूप में निर्यात करें (ग्रहण के भीतर राइट-क्लिक प्रोजेक्ट फ़ोल्डर, "निर्यात करें ..." चुनें)। जब आप निर्यात सेटिंग्स को कॉन्फ़िगर करते हैं, तो "जार में आवश्यक लाइब्रेरी निकालें" का चयन करना सुनिश्चित करें। ध्यान रखें, "एक्सट्रैक्ट ..." का चयन करें न कि "पैकेज के लिए आवश्यक लाइब्रेरी ..."।
अतिरिक्त रूप से : आपको अपनी निर्यात सेटिंग में रन-कॉन्फ़िगरेशन का चयन करना होगा। तो, आप हमेशा किसी वर्ग में एक खाली मुख्य () बना सकते हैं और इसे अपने रन कॉन्फ़िगरेशन के लिए उपयोग कर सकते हैं।
वैसे भी, यह 100% समय काम करने की गारंटी नहीं है - जैसा कि आप एक पॉप-अप संदेश देखेंगे जो आपको यह सुनिश्चित करने के लिए कहेंगे कि आप उन जार फ़ाइलों के लाइसेंस की जांच कर रहे हैं जिनमें आप शामिल हैं और हस्ताक्षर फ़ाइलों की प्रतिलिपि नहीं बनाने के बारे में कुछ। हालांकि, मैं वर्षों से ऐसा कर रहा हूं और मुझे कभी समस्या नहीं हुई।
Uber-dir में काम करना मेरे लिए काम करता है क्योंकि हम सभी को रूट: \ java का उपयोग करना चाहिए और संस्करण के साथ संकुल में आउटलेट कोड होते हैं। यानी ca.tecreations-1.0.0। साइनिंग ठीक है क्योंकि जार अपने डाउनलोड किए गए स्थान से बरकरार हैं। तृतीय पक्ष के हस्ताक्षर बरकरार हैं, c: \ java तक निकालें। वहाँ मेरी परियोजना dir है। लॉन्चर से रन करें इसलिए java -cp c: \ java Launcher