मावेन का उपयोग करके एक मोटी जार का निर्माण


118

मेरे पास एक कोड आधार है जिसे मैं जार के रूप में वितरित करना चाहता हूं। इसमें बाहरी जार पर निर्भरता भी है, जिसे मैं अंतिम जार में बांधना चाहता हूं।

मैंने सुना है कि इसका उपयोग किया जा सकता है maven-assembly-plug-in, लेकिन मुझे समझ नहीं आता कि कैसे। क्या कोई मुझे कुछ उदाहरणों की ओर इशारा कर सकता है।

अभी, मैं अंतिम जार को बंडल करने के लिए वसा जार का उपयोग कर रहा हूं। मैं मावेन का उपयोग करके उसी चीज को हासिल करना चाहता हूं।

जवाबों:


143

नोट: यदि आप एक स्प्रिंग-बूट एप्लिकेशन हैं, तो उत्तर का अंत पढ़ें

अपने निम्न प्लगइन जोड़ें pom.xml नवीनतम संस्करण में पाया जा सकता है

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>CHOOSE LATEST VERSION HERE</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
...

इस प्लग-इन को कॉन्फ़िगर करने के बाद, रनिंग mvn packageदो जार उत्पन्न करेगा: एक जिसमें केवल प्रोजेक्ट क्लासेस होंगे, और प्रत्यय "-jar-निर्भरता" के साथ सभी निर्भरता के साथ एक दूसरा मोटा जार।

यदि आप classpathरनटाइम पर सही सेटअप चाहते हैं तो निम्न प्लगइन भी जोड़ें

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

वसंत बूट आवेदन के लिए बस निम्नलिखित प्लगइन का उपयोग करें (इसका उपयुक्त संस्करण चुनें)

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <fork>true</fork>
        <mainClass>${start-class}</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

1
इस प्लगइन का वर्तमान संस्करण अब 2.4 है
गुरूवार

13
अब इसे हटा दिया गया है और इसके बजाय मावेन-शेड-प्लगइन का उपयोग किया जाना चाहिए। @Phlogratos उत्तर देखें: stackoverflow.com/a/16222965/274350
रिचर्ड नीश

2
मावेन-असेंबली-प्लगइन वसा जार के आकार को कम कर सकता है?
मई 12

1
@ रीचर्ड आप कहां देखते हैं कि यह पदावनत है? मैं कुछ भी यहाँ नहीं पा सके maven.apache.org/plugins/maven-assembly-plugin
user3833308

3
@ user3833308 "पदावनत" गलत शब्द हो सकता है, लेकिन maven.apache.org/plugins/maven-assembly-plugin पर दस्तावेज़ीकरण कहता है "यदि आपकी परियोजना आपकी कला को एक उबर-जार में पैकेज करना चाहती है, तो असेंबली प्लगइन केवल बुनियादी प्रदान करता है समर्थन। अधिक नियंत्रण के लिए, मावेन शेड प्लगिन का उपयोग करें। "
रिचर्ड नीश

55

आप मावेन-शेड-प्लगइन का उपयोग कर सकते हैं ।

अपने बिल्ड में शेड प्लगइन को कॉन्फ़िगर करने के बाद कमांड mvn packageएक सिंगल जार बनाएगा जिसमें सभी निर्भरताएं मर्ज हो जाएंगी।


9
यह अब इसे करने का सही तरीका है। मावेन-असेंबली-प्लगिन डॉक्यूमेंटेशन में कहा गया है: "यदि आपका प्रोजेक्ट आपकी कलाकृतियों को उबर-जार में पैकेज करना चाहता है, तो असेंबली प्लगइन केवल मूल समर्थन प्रदान करता है। अधिक नियंत्रण के लिए, मावेन शेड प्लगिन का उपयोग करें।"
रिचर्ड नीश

लेकिन मैं उस एकल .jar को कैसे ले सकता हूं और इसे प्रकाशन के लिए उपयोग कर सकता हूं?
DanGordon

42

हो सकता है कि आप चाहते हैं maven-shade-plugin, निर्भरता को बंडल करें, अप्रयुक्त कोड को कम करें और टकराव से बचने के लिए बाहरी निर्भरता को छिपाएं।

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                        <createDependencyReducedPom>true</createDependencyReducedPom>
                        <dependencyReducedPomLocation>
                            ${java.io.tmpdir}/dependency-reduced-pom.xml
                        </dependencyReducedPomLocation>
                        <relocations>
                            <relocation>
                                <pattern>com.acme.coyote</pattern>
                                <shadedPattern>hidden.coyote</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

संदर्भ:


यदि कोई सामना करता है Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found, तो बस हटा दें <minimizeJar>true</minimizeJar>
कोपरपॉप

यदि आपको "java.lang.SecurityException: Manifest मुख्य विशेषताओं के लिए अमान्य हस्ताक्षर फ़ाइल डाइजेस्ट" मिलती है, तो इसके बाद के संस्करण कॉन्फ़िगरेशन में यह मदद करता है: stackoverflow.com/a/6743609/38368
डेनियल वारोड

12

वास्तव में, जोड़ना

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>

मावेन-जार-प्लगइन की घोषणा मेरे लिए मुख्य फाइल में मुख्य वर्ग प्रविष्टि को नहीं जोड़ती है। मुझे इसे मावेन-असेंबली-प्लगइन में जोड़ना था ताकि मैनिफ़ेस्ट में प्राप्त किया जा सके


5

आप पैकेजिंग के लिए वनजर-मावेन-प्लगइन का उपयोग कर सकते हैं । मूल रूप से, यह आपकी परियोजना और इसकी निर्भरता को एक जार के रूप में इकट्ठा करता है, जिसमें न केवल आपकी परियोजना जार फ़ाइल शामिल है, बल्कि "जार के जार" के रूप में सभी बाहरी निर्भरताएं भी शामिल हैं, जैसे।

<build>
    <plugins>
        <plugin>
            <groupId>com.jolira</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
                <version>1.4.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
        </plugin>
    </plugins>
</build>

नोट 1: कॉन्फ़िगरेशन विकल्प प्रोजेक्ट होम पेज पर उपलब्ध है ।

नोट 2: एक कारण या दूसरे के लिए, मज़ार सेंट्रल में वनजर-मावेन-प्लगइन प्रोजेक्ट प्रकाशित नहीं किया गया है। हालाँकि jolira.com मूल प्रोजेक्ट को ट्रैक करता है और इसे GroupId के साथ प्रकाशित करता है com.jolira


क्या यह निर्भरता चुनना संभव है कि आप किसके साथ पैकेज करना चाहते हैं? उदाहरण के लिए, यदि a.jar और b.jar बाहरी जार हैं और मैं केवल a.jar को अंतिम जार में पैकेज करना चाहता हूं, तो क्या यह कुछ संभव / विन्यास योग्य है?
बियांका

मैं यह भी देखता हूं कि एक-जार सामान अंतिम जार में भी बंडल हो गया है। इससे अंतिम जार का आकार बहुत बढ़ गया। क्या बाहरी जार चुनना संभव है जिसे आप अंतिम जार में शामिल करने का इरादा रखते हैं? यहाँ एक-जार लॉग है: pastebin.com/UwniQJ2X
bianca

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

2

एक विकल्प का निर्माण करने के लिए मावेन शेड प्लगइन का उपयोग करना है uber-jar

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version> Your Version Here </version>
    <configuration>
            <!-- put your configurations here -->
    </configuration>
    <executions>
            <execution>
                    <phase>package</phase>
                    <goals>
                            <goal>shade</goal>
                    </goals>
            </execution>
    </executions>
</plugin>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.