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
有两件事激怒了我:
-
尽管警告声称它将用helper-5.0.0-SNAPSHOT.jar替换my.module-5.0.0-SNAPSHOT.jar,但它实际上并没有这样做,并且当构建完成时,两个文件仍然具有不同的大小。
-
为什么有关更换工件的警告出现?
-
似乎
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个附件
- 具有相同的
my.module
工件ID;target
文件夹中的磁盘上的文件被命名为helper
的事实是无关紧要的,只有GAV坐标很重要 - 具有相同版本的
5.0.0-SNAPSHOT
- 拥有相同的JAR包装
没有分类器来区分它们。 这就是提出警告的原因:您最终会在项目中附加一个有效替换主要工件的辅助工件,因为它具有相同的坐标。 结果是:
- 两个文件在
target
磁盘上都有不同的名称,但这是无关紧要的 - 两者共享相同的坐标,因此只有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作为分类器。