控制jar工件的maven最终名称

我试图在我们的超级POM中定义一个属性,这个属性将被所有子项目用作生成的工件的目的地。

为此,我正在考虑使用project / build / finalName,但这似乎并不奏效,即使对于简单的poms:

命令

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

POM

 maxim@maxim-desktop:/tmp/mvn_test$ cat my-app/pom.xml 
 <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> maxim@maxim-desktop:/tmp/mvn_test/my-app$ 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 ------------------------------------------------------- TESTS ------------------------------------------------------- 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] ------------------------------------------------------------------------ 

我期望string“testing”将出现在生成的工件名称的某处。

我误解了“finalName”的目的吗?

谢谢,Maxim。

您在插件configuration部分设置了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

根据马修的评论,你现在可以这样做:

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

查看错误报告/文档 。

@格言
尝试这个…

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

参考

所有提供的答案都比必要的更复杂。 假设你正在构build一个jar文件,你只需要在你的<properties>部分添加一个<jar.finalName>标签:

 <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,虽然我没有testing过这个。

在包装阶段,插件允许通过文件映射configuration导入的文件名称:

行家入耳式插件

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

如果你已经将你的版本configuration为通过configuration文件或者其他东西进行“testing”,那么对于一个war包来说,

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> 

你一直在使用的方法确实是按照你指定的方式在jar文件中inputstring“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,然后将其复制到你select的目录。

尝试使用outputDirectory属性,如下所述: http ://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

这对我有用

 mvn jar:jar -Djar.finalName=custom-jar-name 

在我使用的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>