相关文章推荐
老实的回锅肉  ·  使用 Docker | pnpm·  2 月前    · 
爱玩的充电器  ·  AI Workflow ...·  2 月前    · 
帅呆的大熊猫  ·  Error when trying to ...·  2 月前    · 
面冷心慈的猴子  ·  File not found ...·  3 周前    · 
幸福的草稿本  ·  GitHub - ...·  2 周前    · 
单身的拐杖  ·  新疆民俗旅游线路_ ...·  7 月前    · 
耍酷的西红柿  ·  Configure Microsoft ...·  1 年前    · 

I'm trying to define a property in our super pom which will be used by all child projects as the destination of the generated artifact.

For this I was thinking about using project/build/finalName yet this does not seem work, even for simple poms:

Command

 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>

And when I executed :

$ 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] ------------------------------------------------------------------------

I would expect the string "testing" would appear somewhere in the generated artifact name.

Am I misunderstanding the purpose of "finalName" ?

Nice to know - all the defaults (including the final name) are inherited from the Super Pom (and is a good reference source) - books.sonatype.com/mvnref-book/reference/… – Andrejs Dec 18 '17 at 19:31 <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.2</version> <configuration> <finalName>myJar</finalName> </configuration> </plugin>

As indicated in the official documentation.

Update:

For Maven >= 3

Based on Matthew's comment you can now do it like this:

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

See bug report/documentation.

Can you specify the "finalName" at the command line? (-Djar.finalName=x) does not appear to work. – jayunit100 Jul 31 '13 at 19:27 I haven't tried using the command line. Have you tried the Maven solution? – Christian Vielma Aug 1 '13 at 15:40 With Maven plugins one does not have to include version. I assume it picks the latest. And if someone has wondered, the jar name is without file suffix, so no "myJar.jar" but "myJar" as it is correctly shown in the example. – Espinosa Oct 11 '15 at 16:28 As of version 3.0.0 the finalName configuration has been removed. However the OP's method should work. See issues.apache.org/jira/browse/MJAR-233 – Matthew Aug 9 '16 at 8:40

All of the provided answers are more complicated than necessary. Assuming you are building a jar file, all you need to do is add a <jar.finalName> tag to your <properties> section:

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

This will generate a jar:

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

This is in the documentation - note the User Property:

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

Command Line Usage

You should also be able to use this option on the command line with:

mvn -Djar.finalName=myCustomName ...

You should get myCustomName.jar, although I haven't tested this.

With Spring Boot this doesn't work as stackoverflow.com/a/14490656/2294031. Whereas <jar.finalName>foo</jar.finalName> creates two jars: an executable jar including dependencies named foo-${project.version}.jar and a second jar only containing the project named ${project.name}-${project.version}.jar, <build><finalName>foo</finalName></build> creates only the executable jar including dependencies named foo.jar – Snozzlebert Jun 30 '17 at 10:03 Works and I agree this is the simple answer and you can even do <jar.finalName>${groupId}-${artifactId}-${version}</jar.finalName> – MG Developer Aug 23 '18 at 1:30
 <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

Output

[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] ------------------------------------------------------------------------
Reference

in my case, <file> had to be <file>${build.directory}/${project.build.finalName}.${project.packaging}</file> – Cpt. Senkfuss Aug 23 '13 at 12:23 What's the difference between putting the finalName tag directly in the maven-install-plugin VS maven-jar-plugin? – Pocketkid2 Aug 24 '15 at 18:21 This is great, I was able to use this trick to publish an .xml file directly as an artifact. – Benjamin Damm May 19 '16 at 22:53 Why is the artifact installed twice with two different names? Please show a configuration to install it just once. – chrisinmtown Feb 7 '17 at 18:29

At the package stage, the plugin allows configuration of the imported file names via file mapping:

maven-ear-plugin

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

If you have configured your version to be 'testing' via a profile or something, this would work for a war package:

maven-war-plugin

<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>

The approach you've been using indeed does jar file with a string 'testing' in its name, as you specified, but the default install command sends it to your ~/.m2/repository directory, as seen in this output line:

/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

It seems to me that you're trying to generate a jar with such name and then copy it to a directory of your choice.

Try using outputDirectory property as described here: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

Actually, my complete setup is the following: I have superpom in which I would like to define the current version I'm building for. Then I have several projects that define this pom as their parent. I use hudson-ci to build all these projects. Then hudson pushed the projects into artifactory. I'm seeking something that would allow me to change the version that is currently being built. I will have a look at how I can use your new input. Thank you. – Maxim Veksler Nov 21 '10 at 17:26 So... in order to control the version that will be installed I need to override a different maven parameter? – Maxim Veksler Nov 21 '10 at 17:28 That's not correct. The name in the local repo is normalized: groupId/artifactId/version/artifactId-version-classifier.packaging. finalName only applies to the local file name in the output directory. – Sean Patrick Floyd Nov 21 '10 at 18:48 Thanks for noticing. Actually, the very line I quoted shows my error. However, I got the impression that what Maxim needed was the jar in local directory (of his choice). – Goran Jovic Nov 21 '10 at 20:38 @SeanPatrickFloyd so is there any way to change artifactId-version-classifier.packaging to cutom name ? – Khalid Abu El-Soud Dec 11 '14 at 13:17 <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>

This way you can define each value individually or pragmatically from Jenkins of some other system.

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

This will place a folder target\{group.id}\projectName-1.2.3.jar

A better way to save time might be

<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>

Like the same except I use on variable.

  mvn package -DbaseVersion=0.3.4

This will place a folder target\{group.id}\projectName-1.2.3.jar

you can also use outputDirectory inside of configuration to specify a location you may want the package to be located.

<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>

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.

site design / logo © 2019 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2019.11.4.35324