जार आर्टवर्क का अंतिम नाम मावेन नियंत्रित करना


174

मैं अपने सुपर पोम में एक संपत्ति को परिभाषित करने की कोशिश कर रहा हूं जिसका उपयोग सभी बाल परियोजनाओं द्वारा उत्पन्न कलाकृति के गंतव्य के रूप में किया जाएगा।

इसके लिए मैं इस बारे में सोच रहा था कि project/build/finalNameयह अभी भी काम नहीं करता है, यहां तक ​​कि साधारण पॉम के लिए भी:

आदेश

 mvn archetype:create \ 
   -DarchetypeGroupId=org.apache.maven.archetypes \
   -DgroupId=com.mycompany.app \
   -DartifactId=my-app

पोम

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>my-app</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <build>
        <finalName>${project.name}-testing</finalName>
  </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

और जब मैंने निष्पादित किया:

$ mvn install

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building my-app
[INFO]    task-segment: [install]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /tmp/mvn_test/my-app/src/main/resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources {execution: default-testResources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /tmp/mvn_test/my-app/src/test/resources
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test {execution: default-test}]
[INFO] Surefire report directory: /tmp/mvn_test/my-app/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mycompany.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.024 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] [jar:jar {execution: default-jar}]
[INFO] [install:install {execution: default-install}]
[INFO] Installing /tmp/mvn_test/my-app/target/my-app-testing.jar to /home/maxim/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Sun Nov 21 18:37:02 IST 2010
[INFO] Final Memory: 17M/162M
[INFO] ------------------------------------------------------------------------

मुझे उम्मीद है कि स्ट्रिंग "परीक्षण" उत्पन्न विरूपण साक्ष्य नाम में कहीं दिखाई देगा।

क्या मैं "फाइनलनेम" के उद्देश्य को गलत समझ रहा हूं?


पता करने के लिए अच्छा - सभी डिफ़ॉल्ट (अंतिम नाम सहित) सुपर पोम से लिए गए हैं (और है एक अच्छा संदर्भ स्रोत) - books.sonatype.com/mvnref-book/reference/...
Andrejs

जवाबों:


291

आप finalNameप्लगइन कॉन्फ़िगरेशन अनुभाग में संपत्ति सेट करें :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <finalName>myJar</finalName>                   
    </configuration>
</plugin>       

जैसा कि आधिकारिक दस्तावेज में दिखाया गया है ।

अपडेट करें:

मावेन के लिए = = 3

मैथ्यू की टिप्पणी के आधार पर अब आप इसे इस तरह कर सकते हैं:

 <packaging>jar</packaging>
 <build>
   <finalName>WhatEverYouLikey</finalName>
 </build>

बग रिपोर्ट / प्रलेखन देखें ।


2
क्या आप कमांड लाइन पर "अंतिम नाम" निर्दिष्ट कर सकते हैं? -Djar.finalName = x) काम करने के लिए प्रकट नहीं होता है।
jayunit100

मैंने कमांड लाइन का उपयोग करने की कोशिश नहीं की है। आप मावेन समाधान की कोशिश की है?
क्रिश्चियन विल्मा

1
अपडेट का एक बिट, 2.4 नवीनतम संस्करण है। हालांकि अभी भी ठीक काम करता है।
पॉलबगड

1
मावेन प्लगइन्स के साथ एक संस्करण को शामिल करने की आवश्यकता नहीं है। मुझे लगता है कि यह नवीनतम उठाता है। और अगर किसी ने सोचा है, तो जार नाम फ़ाइल के प्रत्यय के बिना है , इसलिए कोई "myJar.jar" नहीं , लेकिन "myJar" जैसा कि उदाहरण में सही ढंग से दिखाया गया है।
एस्पिनोसा

13
संस्करण 3.0.0 के रूप में finalNameकॉन्फ़िगरेशन हटा दिया गया है। हालांकि ओपी का तरीका काम करना चाहिए। मुद्दों को
मैथ्यू

42

सभी दिए गए उत्तर आवश्यक से अधिक जटिल हैं। मान लें कि आप एक जार फ़ाइल बना रहे हैं, तो आपको बस <jar.finalName>अपने <properties>सेक्शन में एक टैग जोड़ना होगा :

<properties>
    <jar.finalName>${project.name}</jar.finalName>
</properties>

यह एक जार उत्पन्न करेगा:

project/target/${project.name}.jar

यह दस्तावेज में है - ध्यान दें User Property:

finalName:
Name of the generated JAR.
Type: java.lang.String
Required: No
User Property: jar.finalName
Default: ${project.build.finalName}

कमांड लाइन उपयोग

आपको कमांड लाइन पर इस विकल्प का उपयोग करने में सक्षम होना चाहिए:

mvn -Djar.finalName=myCustomName ...

आपको myCustomName.jar मिलना चाहिए, हालांकि मैंने इसका परीक्षण नहीं किया है।


6
स्प्रिंग बूट के साथ यह stackoverflow.com/a/14490656/2294031 के रूप में काम नहीं करता है । जबकि <jar.finalName>foo</jar.finalName>दो जार बनाता है: एक निष्पादन योग्य जार जिसमें नाम पर निर्भरताएं foo-${project.version}.jarऔर एक दूसरा जार है जिसमें केवल नाम की परियोजना है ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build>केवल निष्पादन योग्य जार है, जिसमें नाम निर्भरताएं शामिल हैंfoo.jar
स्नोज्ज़लबर्ट

वर्क्स और मैं मानता हूं कि यह सरल उत्तर है और आप <jar.finalName> $ {groupId} - $ {विरूपण साक्ष्य}} - $ {संस्करण} </ jar.finalName>
MG डेवलपर

37

@Maxim
इस कोशिश ...

pom.xml

 <groupId>org.opensource</groupId>
 <artifactId>base</artifactId>
 <version>1.0.0.SNAPSHOT</version>

  ..............
<properties>
    <my.version>4.0.8.8</my.version>
</properties>

<build>
    <finalName>my-base-project</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <phase>install</phase>
                    <configuration>
                        <file>${project.build.finalName}.${project.packaging}</file>
                        <generatePom>false</generatePom>
                        <pomFile>pom.xml</pomFile>
                        <version>${my.version}</version>
                    </configuration>
                </execution>
            </executions>
        </plugin>
</plugins>
</build>

Commnad mvn clean install

उत्पादन

[INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ base ---
[INFO] Building jar: D:\dev\project\base\target\my-base-project.jar
[INFO]
[INFO] --- maven-install-plugin:2.3.1:install (default-install) @ base ---
[INFO] Installing D:\dev\project\base\target\my-base-project.jar to H:\dev\.m2\repository\org\opensource\base\1.0.0.SNAPSHOT\base-1.0.0.SNAPSHOT.jar
[INFO] Installing D:\dev\project\base\pom.xml to H:\dev\.m2\repository\org\opensource\base\1.0.0.SNAPSHOT\base-1.0.0.SNAPSHOT.pom
[INFO]
[INFO] --- maven-install-plugin:2.3.1:install-file (default) @ base ---
[INFO] Installing D:\dev\project\base\my-base-project.jar to H:\dev\.m2\repository\org\opensource\base\4.0.8.8\base-4.0.8.8.jar
[INFO] Installing D:\dev\project\base\pom.xml to H:\dev\.m2\repository\org\opensource\base\4.0.8.8\base-4.0.8.8.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------


संदर्भ


5
मेरे मामले में, <file> को <file> $ {build.directory} / $ {project.build.f.fNName} होना था। $ {project.packaging} </ file>
Cpt। सेनकफस

2
अंतिम नाम टैग को सीधे मावेन-इनस्टॉल-प्लगइन VS मावेन-जार-प्लगइन में डालने के बीच क्या अंतर है?
पॉकेटकिड 2

यह बहुत अच्छा है, मैं एक आर्टिकल के रूप में .xml फ़ाइल को सीधे प्रकाशित करने के लिए इस ट्रिक का उपयोग करने में सक्षम था।
बेंजामिन डैम

1
यह पहले बेस-1.0.0.SNAPSHOT.jar और फिर बेस-4.0.8.8.jar का निर्माण कर रहा है?
मार्क डब्ल्यू

1
दो अलग-अलग नामों से दो बार कलाकृतियों को क्यों स्थापित किया गया है? कृपया इसे एक बार स्थापित करने के लिए एक विन्यास दिखाएं।
चि्रिसनटाउन

18

पैकेज चरण में, प्लगइन फ़ाइल मैपिंग के माध्यम से आयातित फ़ाइल नामों के कॉन्फ़िगरेशन की अनुमति देता है:

Maven-कान-प्लगइन

http://maven.apache.org/plugins/maven-ear-plugin/examples/customize-file-name-mapping.html

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ear-plugin</artifactId>
    <version>2.7</version>
    <configuration>
       [...]
        <fileNameMapping>full</fileNameMapping>
    </configuration>
</plugin>

http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html#outputFileNameMapping

यदि आपने अपना संस्करण किसी प्रोफ़ाइल या किसी चीज़ के माध्यम से 'परीक्षण' के लिए कॉन्फ़िगर किया है, तो यह युद्ध पैकेज के लिए काम करेगा:

Maven युद्ध प्लगइन

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <encoding>UTF-8</encoding>                        
        <outputFileNameMapping>@{groupId}@-@{artifactId}@-@{baseVersion}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
    </configuration>
</plugin>

1
और एक जार संग्रह के लिए?
स्टीफन


3

जैसा कि आप निर्दिष्ट कर रहे हैं, एक स्ट्रिंग 'परीक्षण' के साथ आप वास्तव में जार फाइल का उपयोग कर रहे हैं, जैसा कि आपने निर्दिष्ट किया था, लेकिन डिफ़ॉल्ट इंस्टॉल कमांड इसे आपके ~ / .m2 / रिपॉजिटरी डायरेक्टरी में भेजता है, जैसा कि इस आउटपुट लाइन में देखा गया है:

/tmp/mvn_test/my-app/target/my-app-testing.jar to /home/maxim/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar

यह मुझे लगता है कि आप इस तरह के नाम से एक जार उत्पन्न करने की कोशिश कर रहे हैं और फिर इसे अपनी पसंद की निर्देशिका में कॉपी कर सकते हैं।

यहां बताए अनुसार आउटपुटडायरेक्ट्री प्रॉपर्टी का उपयोग करने का प्रयास करें: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


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

तो ... उस संस्करण को नियंत्रित करने के लिए जिसे स्थापित किया जाएगा मुझे एक अलग मावेन पैरामीटर को ओवरराइड करने की आवश्यकता है?
मैक्सिम वीक्स्लर

7
यह सही नहीं है। स्थानीय रेपो में नाम सामान्यीकृत है groupId/artifactId/version/artifactId-version-classifier.packaging:। अंतिम नाम केवल आउटपुट निर्देशिका में स्थानीय फ़ाइल नाम पर लागू होता है।
शॉन पैट्रिक फ्लोयड

ध्यान देने के लिए धन्यवाद। दरअसल, मैंने जो लाइन उद्धृत की है, उसमें मेरी त्रुटि दिखाई देती है। हालाँकि, मुझे यह आभास हुआ कि मैक्सिम को स्थानीय निर्देशिका (उनकी पसंद का) में जार की आवश्यकता थी।
गोरान जोविच

@SeanPatrickFloyd तो क्या विरूपण साक्ष्य को बदलने का कोई तरीका है-संस्करण- classifier.packing का नाम कट कर?
खालिद अबू अल-सौद

2

मैं निम्नलिखित का उपयोग कर रहा हूँ

        ....
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <finalName>${project.groupId}/${project.artifactId}-${baseVersion}.${monthlyVersion}.${instanceVersion}</finalName>
            </configuration>
        </plugin>
        ....

इस तरह आप प्रत्येक मूल्य को व्यक्तिगत रूप से या व्यावहारिक रूप से किसी अन्य प्रणाली के जेनकिंस से परिभाषित कर सकते हैं।

mvn package -DbaseVersion=1 -monthlyVersion=2 -instanceVersion=3

यह एक फ़ोल्डर रखेगा target\{group.id}\projectName-1.2.3.jar

समय बचाने का एक बेहतर तरीका हो सकता है

        ....
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <finalName>${project.groupId}/${project.artifactId}-${baseVersion}</finalName>
            </configuration>
        </plugin>
        ....

वैसा ही जैसा मैं वेरिएबल पर इस्तेमाल करता हूं।

  mvn package -DbaseVersion=0.3.4

यह एक फ़ोल्डर रखेगा target\{group.id}\projectName-1.2.3.jar

आप उस स्थान को निर्दिष्ट करने outputDirectoryके configurationलिए भी उपयोग कर सकते हैं जिसे आप चाहते हैं कि पैकेज स्थित हो।


1

मेरे maven ee प्रोजेक्ट में मैं उपयोग कर रहा हूँ:

<build>
    <finalName>shop</finalName>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>${maven.war.version}</version>
            <configuration><webappDirectory>${project.build.directory}/${project.build.finalName}     </webappDirectory>
            </configuration>
        </plugin>
    </plugins>
</build>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.