那是因为你误解了警告。
让我们回顾一下。Maven项目不是类型
pom
默认情况下,将始终生成所谓的主工件。对于JAR,这个工件是将编译的源代码打包到JAR中的结果;对于WAR,它是构建web应用程序的结果。
重要的是要记住,这个工件
附属的
对于项目:当项目安装(带有
mvn install
),已部署(使用
mvn deploy
)或发布(使用
maven-release-plugin
).
附属的
这意味着该工件将在项目完成时安装/部署/发布
target
目标
the notion
classifier
kicks in
.
在Maven存储库中,每个文件都必须遵循相同的命名约定:
artifactId-version(-classifier).type
。每个次要工件都将具有与主工件相同的GAV(组id、工件id、版本),因此如果您想放入Maven repo 1主工件和1个附加工件(就像主JAR及其JAR Javadoc和JAR源一样),您需要某种方法来区分它们。这就是
分类器
现在让我们回到您的示例。你的Maven项目
jar
打包时,将默认生成一个名为
my.module-5.0.0-SNAPSHOT.jar
; 默认情况下,这个主JAR仍然附加到项目中(并且可以安装/部署)。现在您正在配置
maven-assembly-plugin
创建一个新的JAR工件(称为
helper-5.0.0-SNAPSHOT.jar
但这真的无关紧要)。默认情况下,程序集插件,
attaches to the project the artifact it produces
所以你最终得到了2个附加的工件
-
my.module
; 磁盘上的文件位于
目标
文件夹已命名
helper
一个是无关紧要的,只有GAV坐标才重要
-
具有相同版本的
5.0.0-SNAPSHOT
-
与JAR包装相同
没有分类器来区分它们。这就是提出警告的原因:您最终会将一个有效替代主工件的辅助工件附加到项目中,这仅仅是因为它具有相同的坐标。因此,结果是:
-
两个文件在内部磁盘上具有不同的名称
目标
,但这无关紧要,因为
-
它是由程序集插件生成的,将赢得冲突,并替换附加的主工件。
如果你想说服自己,跑吧
mvn clean install
并检查您的本地回购。您会注意到,只有
jar-with-dependencies
将安装工件。另一个(主要的人工制品)变得很糟糕。
您还可以配置
<distributionManagement>
:
<distributionManagement>
<repository>
<id>local-repo-test</id>
<url>file://...</url>
</repository>
</distributionManagement>
并调用
mvn clean deploy
。然后您可以检查唯一部署的工件是否是
.
最后说明:是的
classifier
Assembly Plugin的参数已弃用,因为您应该只使用程序集id作为分类器。