maven-assembly-plugin:如何使用appendAssemblyId

我有一个多模块Maven项目,在一个模块中我想在构建期间创建两个工件:

  • 主要工件是一个jar库,其他一些模块将依赖它。
  • 一个执行一些辅助函数的可执行jar文件。 没有其他模块依赖于此,它仅供用户在某些情况下手动运行。

这是我用来配置maven-assembly-plugin插件的代码:

   maven-assembly-plugin  2.4   dist-assembly package  single   bso  jar-with-dependencies  helper-${project.version} false   HelperMain       

我将appendAssemblyId设置为false ,否则-jar-with-dependencies将被附加到最终名称,我不认为需要它。 省略它可以提供更清晰,更易于使用的文件名。

当我运行mvn integration-test我收到以下警告:

[警告]配置选项:’appendAssemblyId’设置为false,并且缺少’classifier’。 它不会附加汇编文件:[…] / target / helper-5.0.0-SNAPSHOT.jar,而是成为主项目工件的文件。

注意:如果为此项目提供了多个描述符或描述符格式,则此文件的值将是不确定的!

[警告]用程序集文件替换预先存在的项目主工件文件:[…] / target / my.module-5.0.0-SNAPSHOT.jar:[…] / target / helper-5.0.0- SNAPSHOT.jar

有两件事激怒了我:

  1. 尽管警告声称它将用helper-5.0.0-SNAPSHOT.jar替换my.module-5.0.0-SNAPSHOT.jar,但它实际上并没有这样做,并且当构建完成时,两个文件仍然具有不同的大小。

  2. 为什么有关更换工件的警告出现?

  3. 似乎classifier器已被弃用,为什么警告要求我使用它?

那是因为你错误地解释了这些警告。


让我们回顾一下。 默认情况下,不属于pom类型的Maven项目将始终生成所谓的主要工件。 对于JAR,此工件是将已编译的源打包到JAR中的结果; 对于WAR,它是构建Web应用程序的结果。

重要的是要记住这个工件附加到项目:当项目安装(使用mvn install ),部署(使用mvn deploy )或发布(使用maven-release-plugin )时,此术语非常有用。 附加意味着在项目进行时将安装/部署/释放此工件。 并非Maven构建期间生成的所有文件(基本上, target文件夹下的所有内容)都是; 只有附加的文件。 因此,您可以很好地在target下创建大量文件,但只有一个已安装的工件。

除了这个主要工件外,您可能希望构建生成其他工件以进行安装或部署。 这是附加或辅助附加工件的概念。 主要的例子是Javadoc或源:通常在项目发布时,它的Javadoc及其来源也是。 这就是概念classifier用武之地 。

在Maven存储库中,每个文件都必须遵循相同的命名约定: artifactId-version(-classifier).type 。 每个辅助工件都将具有与主工件相同的GAV(组ID,工件ID,版本),因此如果您想要放入Maven repo 1主工件和1个附加工件(就像主JAR一样)使用它的JAR Javadoc和JAR源代码,你需要一些方法来区分它们。 classifier器的用途是:将二级工件与主工件区分开来。


我们现在回到你的例子。 您的Maven项目是jar包装,默认情况下会生成一个名为my.module-5.0.0-SNAPSHOT.jar的主要JAR工件; 仍然默认情况下,此主JAR附加到项目(并准备安装/部署)。 现在你正在配置maven-assembly-plugin以创建一个新的JAR工件(称为helper-5.0.0-SNAPSHOT.jar但它确实无关紧要)。 默认情况下,Assembly Plugin 会将项目生成的工件附加到项目中 。 所以你最终会得到2个附件

  1. 具有相同的my.module工件ID; target文件夹中的磁盘上的文件被命名为helper的事实是无关紧要的,只有GAV坐标很重要
  2. 具有相同版本的5.0.0-SNAPSHOT
  3. 拥有相同的JAR包装

没有分类器来区分它们。 这就是提出警告的原因:您最终会在项目中附加一个有效替换主要工件的辅助工件,因为它具有相同的坐标。 结果是:

  1. 两个文件在target磁盘上都有不同的名称,但这是无关紧要的
  2. 两者共享相同的坐标,因此只有1个存活。

它是由Assembly Plugin生成的,它将赢得冲突,并替换附加的主要工件。

如果你想说服自己, mvn clean install在项目上运行mvn clean install并检查你的本地仓库。 您会注意到只会安装jar-with-dependencies工件。 另一个(主要的神器)走了。

您还可以配置

   local-repo-test file://...   

并调用mvn clean deploy 。 然后,您可以检查唯一部署的工件是否为jar-with-dependencies


最后注意:是的,不推荐使用Assembly Plugin的classifier参数,因为您应该只使用程序集ID作为分类器。