我目前正在使用jar-with-dependencies程序集来创建这样一个jar。但是,我的罐子的名字有点长。
由于AS400上的RPG程序正在使用这个jar,我想缩短它以使这些开发人员的生活更轻松。但是,除了手工之外,我还没有找到一种方法来重命名罐子project-name-version-classifier-jar-with-dependencies.jar
。我喜欢project-name-version-classifier-full.jar
无论如何在没有基本上复制jar-with-dependencies程序集描述符并将其调用为完的情况下执行此操作?
此外,我希望继续使用没有存储在存储库中的类路径的jar。
我需要两个文物。我的分类器的jar包含构建所在的区域。包含所有依赖项的jar,也包括该区域。
project-name-version-region-full.jar
和project-name-version-region.jar
应存储在存储库中。在第一个例子中,分类器是区域满的,在第二个区域。后者正在发挥作用。
答案 0 :(得分:203)
您可以指定 finalName 属性为jar提供所需的名称,并指定 appendAssemblyId 应该为false以避免“jar-with-dependencies”后缀
下面的配置将输出一个名为“test.jar”的jar
<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>
更新:根据您的评论,使用内置描述符将无法正常工作。我相信这是最近版本的assembly-plugin中的一个错误 - 他们已经删除了对分类器的支持,但是如果你使用内置的描述符,id就会被修复,所以你最终会得到一个很大的愚蠢名称。
作为一种变通方法,您可以复制jar-with-dependencies描述符使用的程序集描述符并修改id。
此示例将导致程序集ID附加到finalName,因此如果您需要名称 region-full.jar ,则可以将finalName指定为 region < / em>和程序集ID为完整。这将导致目标中的文件名为region-full.jar,但请注意,它仍将作为附加工件安装到Maven存储库,其中完整用作分类器。只要这个id与你的其他程序集不同,就应该没有碰撞。
pom配置看起来像这样。
<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>
和src / main / assembly中的jar-assembly.xml如下:
<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>
答案 1 :(得分:26)
我想我已经找到了一种直接在pom中配置它的方法,而不需要单独的jar-assembly.xml。
它与Rich的答案基本相同,除了使用artifactId和version指定finalName。
<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>
答案 2 :(得分:8)
感谢这里的帖子以及maven docs中的一些挖掘,我已经为具有自定义名称的一般一次性重新包装的可执行jar程序集提供了以下配置。
在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>
在assembly.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
,并将其所有依赖项重新打包到同一个jar和指定的Main-Class: karlthepagain.MyMain
中。
答案 3 :(得分:3)
我打算让Rich把我指向正确的方向,但想发布一个对我有用的解决方案,因为Rich's稍微偏离了:
我的jar-assembly.xml看起来像这样,允许在我的配置文件中存储为属性的区域更改程序集ID:
<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>
我没有在maven-assembly-plugin设置中使用finalName参数,因为这使用我的project-name-version-env-full.jar名称构建了我的项目,其中env-full是分类器。
想象一下,当我了解到程序集xml可以通过构建中的项进行参数化时,我会感到惊讶。这正是我想要的。
答案 4 :(得分: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>
答案 5 :(得分:0)
也可以通过使用${project.build.finalName}
作为最终名称来覆盖原始jar文件:
<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>