क्या मावेन जार-के साथ निर्भरता का नाम बदलना संभव है?


138

मैं वर्तमान में जार-इन-डिपेंडेंसी असेंबली का उपयोग ऐसे जार बनाने के लिए कर रहा हूं। हालाँकि, मेरे जार का नाम थोड़ा लंबा है।

चूंकि इस जार का उपयोग AS400 पर आरपीजी कार्यक्रमों द्वारा किया जा रहा है, मैं इसे उन डेवलपर्स के लिए जीवन को थोड़ा आसान बनाने के लिए छोटा करना चाहूंगा। लेकिन, हाथ के अलावा, मुझे सामान्य रूप से जार का नाम बदलने का कोई तरीका नहीं मिला है project-name-version-classifier-jar-with-dependencies.jar। मुझे कुछ पसंद आएगाproject-name-version-classifier-full.jar

वहाँ वैसे भी यह मूल रूप से जार के साथ निर्भरता विधानसभा विवरण की नकल के बिना ऐसा करने के लिए है और इसे पूर्ण कहते हैं?

इसके अतिरिक्त, मैं भंडार में संग्रहित जमा किए गए क्लासपैथ के बिना जार को जारी रखना चाहता हूं।

मुझे दो कलाकृतियों की जरूरत है। मेरे क्लासिफायर के साथ जार उस क्षेत्र को पकड़ता है जो निर्माण के लिए है। सभी निर्भरताओं के साथ जार जिसमें क्षेत्र भी शामिल है।

project-name-version-region-full.jarऔर project-name-version-region.jarभंडार में संग्रहित किया जाना चाहिए। पहले उदाहरण में क्लासिफायर क्षेत्र-पूर्ण है, दूसरे में यह क्षेत्र है। बाद वाला काम कर रहा है।

जवाबों:


227

आप निर्दिष्ट कर सकते finalName जार नाम आप चाहते हैं देने के लिए संपत्ति, और निर्दिष्ट करें कि appendAssemblyId "जार-साथ-निर्भरता" प्रत्यय से बचने के लिए झूठी होना चाहिए।

नीचे दिया गया विन्यास "परीक्षण.जर" नामक एक जार को आउटपुट करेगा

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>test</finalName>
        <appendAssemblyId>false</appendAssemblyId>
      </configuration>
    </execution>
  </executions>
</plugin>

अपडेट: आपकी टिप्पणियों के आधार पर, अंतर्निहित डिस्क्रिप्टर का उपयोग करने से काम नहीं चलेगा। मेरा मानना ​​है कि यह असेंबली-प्लगइन के हाल के संस्करणों में एक बग के लिए नीचे है - उन्होंने क्लासीफायर के लिए समर्थन हटा दिया है, लेकिन आईडी तय हो गई है यदि आप एक अंतर्निहित डिस्क्रिप्टर का उपयोग करते हैं, तो आप एक बड़ा बेड़ा नाम के साथ समाप्त होते हैं।

वर्कअराउंड के रूप में, आप जार--डिपेंडेंसी डिस्क्रिप्टर द्वारा उपयोग किए गए असेंबली डिस्क्रिप्टर को कॉपी कर सकते हैं और आईडी को संशोधित कर सकते हैं।

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

पोम विन्यास इस तरह दिखेगा।

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>src/main/assembly/jar-assembly.xml</descriptor>
        </descriptors>
        <finalName>region</finalName>
      </configuration>
    </execution>
  </executions>
</plugin>

और जार-असेंबली। xml इस तरह से src / main / विधानसभा में:

<assembly>
  <id>full</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
    </fileSet>
  </fileSets>
</assembly>

उस विस्तार पर काम करना रिच। अनिवार्य रूप से, मुझे दो क्लासिफायर कलाकृतियों को संग्रहीत करने की आवश्यकता है। AppendAssemblyId चालू होने के साथ, मेरे पास 3 आर्टिफिशिएक्ट्स थे, एक बिना क्लासिफायरियर, क्लासिफायर वर्जन, और जार-विद-डिपेंडेंसी वर्जन। AppendAssemblyID के साथ uber जार बंद कर दिया गया है जो गैर-क्लासिफायर संस्करण में स्थापित है। मुझे इन लोगों को एक क्षेत्र + पूर्ण आधारित क्लासिफायरियर का उपयोग करने की आवश्यकता है जो कहता है कि वे कहाँ के लिए बनाए गए थे। दुर्भाग्य से क्लासिफायर टैग जोड़ने से काम नहीं चलता।
माइक कॉर्नेल

36

मुझे लगता है कि मैंने एक अलग जार-असेंबली.एक्सएमएल की आवश्यकता के बिना इसे सीधे पोम में कॉन्फ़िगर करने का एक तरीका पाया है।

यह मूल रूप से रिच के जवाब के समान है, सिवाय अंतिमनाम के कलाकृतियों और संस्करण के साथ निर्दिष्ट किया गया है।

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>${project.artifactId}-${project.version}-full</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <archive>
            <manifest>
                <mainClass>com.mycompany.MyMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-my-jar-with-dependenciess</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

8

यहाँ पदों के लिए धन्यवाद और मावन डॉक्स में कुछ खुदाई मैं एक सामान्य नाम के साथ एक सामान्य एक-बंद repacked निष्पादन जार विधानसभा के लिए निम्नलिखित कॉन्फ़िगरेशन के साथ आया हूं।

Pom.xml में:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>exe</id>
            <phase>package</phase>
            <goals><goal>single</goal></goals>
            <configuration>
                <finalName>MyJarName</finalName>
                <attach>false</attach>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>assembly.xml</descriptor>
                </descriptors>
                <archive>
                    <manifest>
                        <mainClass>karlthepagain.MyMain</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </execution>
    </executions>
</plugin>

असेंबली में। Xml:

<assembly>
    <id>exe</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

यह MyJarName.jarअपने सभी निर्भरता के साथ उसी जार और निर्दिष्ट में फिर से पैक किया जाएगा Main-Class: karlthepagain.MyMain


3

मैं रिच को सही दिशा में इशारा करने का श्रेय देने जा रहा हूं, लेकिन वह समाधान पोस्ट करना चाहता था जो रिच के रूप में मेरे लिए काम कर रहा था:

मेरा जार-असेम्बली.एक्सएमएल इस तरह दिखता है जिसने असेंबली आईडी को उस क्षेत्र के लिए बदलने की अनुमति दी है जिसे मेरी प्रोफ़ाइल में एक संपत्ति के रूप में संग्रहीत किया गया था:

<assembly>
  <id>${env}-full</id>
    <formats>
      <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
      <dependencySet>
        <unpack>true</unpack>
        <scope>runtime</scope>
      </dependencySet>
    </dependencySets>
    <fileSets>
      <fileSet>
        <directory>${project.build.outputDirectory}</directory>
      </fileSet>
    </fileSets>
</assembly>

मैंने मावेन-असेंबली-प्लगइन सेटिंग्स में फाइनलनेम पैरामीटर का उपयोग नहीं किया क्योंकि इसने मेरे प्रोजेक्ट-नेम-वर्जन-एनव-फुल.जर नाम के साथ मेरा प्रोजेक्ट बनाया था, जहां एनवाइ-फुल क्लासीफायर था।

मेरे आश्चर्य की कल्पना कीजिए जब मैंने सीखा कि विधानसभा xml को बिल्ड में आइटम द्वारा पैरामीटर किया जा सकता है। यह ठीक वही है जिसकी मुझे तलाश थी।


2

इसने मेरे लिए काम किया

<build>
    <finalName>anynameyoulike</finalName>
    <plugins>           
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>                   
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>com.mycompany.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </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>
    </plugins>
</build>

1

${project.build.finalName}अंतिम नाम के रूप में उपयोग करके मूल जार फ़ाइल को अधिलेखित करना भी संभव है :

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
   <executions>
      <execution>
          <phase>package</phase>
          <goals>
             <goal>single</goal>
          </goals>
      </execution>
   </executions>
   <configuration>
     <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <finalName>${project.build.finalName}</finalName>
     <appendAssemblyId>false</appendAssemblyId>
   </configuration>
 </plugin>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.