有没有可能重命名一个带依赖项的 maven jar?

我目前正在使用带依赖项的 jar 程序集来创建这样一个 jar。但是,我的罐子的名字有点长。

由于 AS400上的 RPG 程序正在使用这个 jar,因此我想缩短它的使用时间,以使这些开发人员的工作更加轻松。但是,除了手工操作,我还没有找到一种方法来从通常的 project-name-version-classifier-jar-with-dependencies.jar重命名罐子。我想要类似 project-name-version-classifier-full.jar的东西

是否有办法在不基本上复制带依赖项的 jar 程序集描述符并调用它 full 的情况下实现这一点?

此外,我希望继续使用 jar,而不将类路径组装起来存储在存储库中。

我需要两件藏物。带有我的分类器的 jar 保存着构建所针对的区域。具有所有依赖项(也包括区域)的 jar。

project-name-version-region-full.jarproject-name-version-region.jar应该存储在存储库中。在第一个例子中,分类器是区域完整的,在第二个例子中,分类器是区域完整的。后者正在发挥作用。

92714 次浏览

您可以指定 最终名称属性来为 jar 提供所需的名称,并指定 附录应该为 false,以避免“ jar-with-endencies”后缀。

下面的配置将输出一个名为“ 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>

更新: 根据您的注释,使用内置的描述符将不起作用。我相信这是最近版本的汇编中的一个 bug ——插件——他们已经删除了对分类器的支持,但是如果你使用一个内置的描述符,id 是固定的,所以你最终会得到一个很愚蠢的名字。

作为解决方案,您可以复制 带依赖项的 jar描述符使用的程序集描述符并修改 id。

这个示例将导致程序集标识被追加到 finalName,因此如果需要使用名称 区域装满的罐子,可以将 finalName 指定为 地区,将程序集标识指定为 满了。这将在目标文件 region-full.jar 中生成一个文件,但是注意,它仍然作为一个附加工件安装到 Maven 存储库中,并使用 满了作为分类器。只要这个 id 与其他程序集的 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 bly.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>

我要感谢 Rich 为我指出了正确的方向,但是我想要提出一个对我有效的解决方案,因为 Rich 的解决方案有点不对劲:

我的 jar-Assembly bly.xml 看起来像这样,它允许为存储在我的配置文件中的属性区域更改程序集标识:

<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 可以由构建中的项参数化时,可以想象我有多惊讶。这正是我要找的。

感谢这里的帖子和对 Maven 文件的一些挖掘,我已经为一个通用的带有自定义名称的一次性重新打包的可执行 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 bly.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中。

我想我已经找到了一种方法,可以直接在 pom 中配置它,而不需要单独的 jar-Assembly.xml。

它基本上与 Rich 的答案相同,除了 finalName 是用 artifactId 和 version 指定的。

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

这招对我很管用

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

还可以使用 ${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>