控制jar工件的Maven最终名称


174

我正在尝试在我们的超级pom中定义一个属性,该属性将被所有子项目用作生成的工件的目标。

为此,我正在考虑使用project/build/finalName它,即使对于简单的poms,这似乎也不起作用:

命令

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

我希望字符串“ testing”会出现在生成的工件名称中的某处。

我是否误解了“ finalName”的目的?


很高兴知道-所有默认值(包括最终名称)都是从Super Pom继承的(并且是一个很好的参考来源)-books.sonatype.com/mvnref-book/reference/…–
Andrejs

Answers:


290

您可以finalName在插件配置部分中设置属性:

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

官方文件所示

更新:

对于Maven> = 3

根据Matthew的评论,您现在可以像这样:

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

请参阅错误报告/文档


2
您可以在命令行中指定“ finalName”吗?(-Djar.finalName = x)似乎不起作用。
jayunit100

我没有尝试使用命令行。您是否尝试过Maven解决方案?
Christian Vielma

1
稍作更新,最新版本为2.4。仍然可以正常工作。
PaulBGD 2014年

1
使用Maven插件时,不必包含版本。我认为它选择了最新的。如果有人想知道,jar名称没有文件后缀,因此在示例中正确显示的是“ myJar.jar”而不是 “ myJar”。
Espinosa 2015年

13
从3.0.0版开始,该finalName配置已被删除。但是,OP的方法应该起作用。参见issues.apache.org/jira/browse/MJAR-233
马修,

42

提供的所有答案都比必要的复杂。假设您正在构建一个jar文件,只需将<jar.finalName>标记添加到您的<properties>部分中:

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

这将生成一个jar:

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
使用Spring Boot不能作为stackoverflow.com/a/14490656/2294031使用。而<jar.finalName>foo</jar.finalName>创建两个jar:一个foo-${project.version}.jar包含名为${project.name}-${project.version}.jar<build><finalName>foo</finalName></build>foo.jar
Dependencies

Works,我同意这是简单的答案,您甚至可以执行<jar.finalName> $ {groupId}-$ {artifactId}-$ {version} </ 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>

na 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.finalName}。$ {project.packaging} </ file>
Cpt。Senkfuss

2
将finalName标签直接放入maven-install-plugin VS maven-jar-plugin有什么区别?
Pocketkid2

太好了,我能够使用此技巧直接将.xml文件发布为工件。
本杰明·达姆

1
它首先构建base-1.0.0.SNAPSHOT.jar,然后构建base-4.0.8.8.jar?
Mark W

1
为什么工件用两个不同的名称安装了两次?请显示配置以仅安装一次。
chrisinmtown

18

在打包阶段,插件允许通过文件映射配置导入的文件名:

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

如果您已将您的版本配置为通过配置文件或其他方式进行“测试”,则适用于战争包装:

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
还有一个jar档案?
Stephane 2014年


3

正如您所指定的那样,您一直在使用的方法的确确实在jar文件中带有名称字符串“ testing”,但是默认的install命令将其发送到〜/ .m2 / repository目录,如以下输出行所示:

/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

在我看来,您正在尝试生成具有此类名称的jar,然后将其复制到您选择的目录中。

尝试按以下说明使用outputDirectory属性:http ://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html


实际上,我的完整设置如下:我有superpom,我想在其中定义要为其构建的当前版本。然后,我有几个项目将此pom定义为其父级。我使用hudson-ci构建所有这些项目。然后,哈德森将项目推入了虚假阶段。我正在寻找可以使我更改当前正在构建的版本的东西。我将看看如何使用您的新输入。谢谢。
Maxim Veksler,2010年

所以...为了控制将要安装的版本,我需要覆盖其他maven参数吗?
Maxim Veksler,2010年

7
那是不对的。本地存储库中的名称已标准化:groupId/artifactId/version/artifactId-version-classifier.packaging。finalName仅适用于输出目录中的本地文件名。
肖恩·帕特里克·弗洛伊德

感谢您的关注。实际上,我引用的那一行显示了我的错误。但是,我的印象是,Maxim需要的是本地目录中的jar(由他选择)。
Goran Jovic

@SeanPatrickFloyd所以有什么方法可以将artifactId-version-classifier.packaging更改为cutom名称吗?
哈立德·阿布·阿苏德

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

这样,您可以从其他系统的Jenkins单独或实用地定义每个值。

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.