java - बिल्डिंग जार जिसमें सभी निर्भरताएं शामिल हैं




ant jar (5)

"जेनरेट जार में आवश्यक पुस्तकालयों को निकालें" चुनें, जैसे आप निर्यात करते हैं

"जेनरेट जार में आवश्यक पुस्तकालयों को निकालें" चुनें, जैसे आप निर्यात करते हैं

यह संभवत: एक मौलिक प्रश्न है, लेकिन मुझे डर है कि मुझे जावा के बारे में ज्यादा जानकारी नहीं है और मुझे जवाब कहीं भी नहीं मिला।

मैं चींटी पुस्तकालय का निर्माण करने का प्रयास कर रहा हूं जो टीएफएस एसडीके पर निर्भर करता है। मैंने एक प्रोजेक्ट की स्थापना के लिए गाइड का अनुसरण किया, लेकिन जब मैं इसे एक जार के रूप में निर्यात करता हूं और एएनटी का उपयोग करके एक कार्य चलाने की कोशिश करता हूं तो मुझे निम्न त्रुटि मिलती है:

java.lang.NoClassDefFoundError: /com/microsoft/tfs/core/util/TFSUser

मुझे एहसास हुआ कि मैं अपने एएनटी लिब फ़ोल्डर में टीएफएस एसडीके जार डाल सकता हूं, लेकिन यदि संभव हो तो मैं इसे शामिल करने के लिए अपने जार चाहूंगा और पुस्तकालय सिर्फ ऐसा करने के बिना काम करूँगा।

यह उत्तर कहता है कि ग्रहण (मैं 3.7.2 का उपयोग कर रहा हूँ) का उपयोग करने के लिए आवश्यक सभी संसाधनों को शामिल करना संभव है, लेकिन यह वास्तव में यह कैसे करना है इसका विस्तार नहीं करता है। ऐसा करने के लिए एक्लिप्स में क्या विकल्प है?



बस यदि आप मेवेन के साथ कर रहे हैं तो आपको निम्नलिखित प्लगइन को शामिल करना होगा।

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <properties>
            <property>
                <name>listener</name>
                <value>com.example.TestProgressListener</value>
            </property>
        </properties>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

अधिक पढ़ें @ कैसे मैं निर्भरता के साथ जार फ़ाइल का निर्माण कर सकता हूं?


जब आप एक जार का निर्माण करते हैं, तो आपको जार मिलता है जिसमें सिर्फ आपके कोड होते हैं, और आपकी जार की कोई निर्भरता नहीं है। आप जारर्ज की तरह कुछ उपयोग कर सकते हैं ताकि सभी निर्भरताएं जार फ़ाइल को प्रबंधित करने में आसान हो सकें या उपयोग करने में आसानी के लिए सभी निर्भर JARs को एक फ़ोल्डर में कॉपी कर सकें। ऐसा लगता है कि ग्रहण के पास इस प्रकार की चीज़ों को भी करने के विकल्प हैं (ऊपर पोस्ट देखें)।

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


आप पैकेज निर्भरता से पहले एक अलग निर्देशिका में सभी निर्भरताओं को उत्पन्न करने के लिए निर्भरता-प्लगइन का उपयोग कर सकते हैं और उसके बाद मेनिफेस्ट के क्लासपाथ में शामिल कर सकते हैं:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>theMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

वैकल्पिक रूप से सभी जार-फाइलों को मुख्य जार में एकीकृत करने के लिए आउटपुट डायरेक्टरी के रूप में ${project.build.directory}/classes/lib उपयोग करें, लेकिन फिर आपको जार लोड करने के लिए कस्टम क्लासलोडिंग कोड जोड़ने की आवश्यकता होगी।





java ant jar