我有一个多模块Maven项目,在一个模块中我想在构建过程中创建两个工件:
以下是我用来配置maven-assembly-plugin
插件的代码:
<plugin>
<artifactId>
maven-assembly-plugin
</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>dist-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>bso</finalName>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>helper-${project.version}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>HelperMain<mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
我将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
为什么警告要求我使用它?
答案 0 :(得分:31)
那是因为你错误地解释了这些警告。
让我们回顾一下。默认情况下,非pom
类型的Maven项目将始终生成所谓的主要工件。对于JAR,此工件是将已编译的源打包到JAR中的结果;对于WAR,它是构建Web应用程序的结果。
重要的是要记住,此工件是附加到项目中:当项目安装(使用mvn install
),部署时(mvn deploy
,此术语非常有用})或已发布(使用maven-release-plugin
)。 附加表示在项目实施时将安装/部署/发布此工件。并非Maven构建期间生成的所有文件(基本上,target
文件夹下的所有文件)都是;只有附加的文件。因此,您可以在target
下创建大量文件,但只有一个已安装的工件。
除了这个主要工件外,您可能希望构建生成其他工件以进行安装或部署。这是附加或辅助附加工件的概念。主要的例子是Javadoc或源代码:通常在项目发布时,其Javadoc及其来源也是如此。那就是the notion classifier
kicks in。
在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
,但它确实无关紧要)。默认情况下,程序集插件attaches to the project the artifact it produces。所以你最终得到了2个附加的工件
my.module
; target
文件夹中的磁盘上的文件被命名为helper
的事实是无关紧要的,只有GAV坐标很重要5.0.0-SNAPSHOT
并没有分类来区分它们。这就是提出警告的原因:你最终会在项目中附加一个有效替换主要工件的辅助工件,因为它具有相同的坐标。结果是:
target
内的磁盘上具有不同的名称,但这是无关紧要的,因为它是由Assembly Plugin生成的,它将赢得冲突,并替换附加的主要工件。
如果您想说服自己,请在项目上运行mvn clean install
并检查您当地的回购。您会注意到只会安装jar-with-dependencies
工件。另一个(主要的神器)走了。
您还可以配置<distributionManagement>
:
<distributionManagement>
<repository>
<id>local-repo-test</id>
<url>file://...</url>
</repository>
</distributionManagement>
并调用mvn clean deploy
。然后,您可以检查唯一部署的工件是jar-with-dependencies
。
最后注意:是的,不推荐使用Assembly Plugin的classifier
参数,因为您应该只使用程序集ID作为分类器。