Maven JAR插件(版本3.0.2)不断抛出以下错误,即使是对jar
目标的单次调用也是如此:
[错误]无法在项目测试上执行目标org.apache.maven.plugins:maven-jar-plugin:3.0.2:jar(默认):您必须使用分类器将补充工件附加到项目中,而不是替换它们。-〉[Help 1]
下面是一个(最小值?)pom.xml
,它演示了这个问题:
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
调用只是mvn package
。
- 无论是否存在任何类/资源,似乎都没有关系-无论如何都会出现上述错误消息。
- 如果指定了两个目标(
jar
和test-jar
),也会出现此问题。 - 如果没有指定目标,这个问题就不会出现。但是这不是一个选项,因为我确实需要
jar
和test-jar
。
根据文档,classifier
只需要在同一个目标的多次调用中指定,并且test-jar
目标有一个合理的默认值,我不打算更改它。
此外,问题似乎没有出现在JAR插件的2.x行。
我错过了什么吗?谁能告诉我我做错了什么吗?
另外,Maven版本为3.3.9。
4条答案
按热度按时间e4eetjau1#
Jar插件实际上使用以下配置执行了两次:
如果您使用这样的配置检查日志,您将看到类似于以下内容的内容:
这意味着插件实际上被执行了两次。发生的情况是,Jar插件在一个打包为
jar
的项目中有一个绑定到package
阶段的默认执行。这个默认执行就是日志中提到的ID为default-jar
的那个。当你在插件中配置一个
<execution>
时,你实际上配置了一个新的执行,在那里插件的jar
目标被调用。由于jar
goal binds by default to thepackage
phase,在jar
打包固有的默认绑定之后,该执行在那个阶段被执行。由于插件已经运行,它失败了,因为再次运行它实际上会替换第一次运行时已经产生的主要工件。这个错误是在MJAR-198插件的3.0.0版本中添加的,因为这种情况的发生很可能是应当及早检测到的误配置。因此,解决方法很简单:我没有一个指定目标
jar
的执行,让默认的执行(来自jar
打包)来完成这项工作。由于默认的执行,即使没有jar
目标的显式配置,JAR仍然会被创建。如果你还想要一个测试JAR,you will still need to configure the plugin to do that:但请注意,未指定目标
jar
。67up9zun2#
在我的例子中,我将执行ID设置为
default-jar
,覆盖默认的执行,然后错误就消失了。9udxz4iz3#
如果日志显示类似以下内容:
在src/main/java中添加一个无用的类似乎可以解决这个问题,请参见:
http://maven.40175.n5.nabble.com/quot-mvn-clean-verify-deploy-quot-causes-jar-plugin-to-execute-twice-td5877166.html
由于上述链接可能会在2021-09年中断,您可能希望尝试http://mail-archives.apache.org/mod_mbox/maven-users/201608.mbox/thread作为替代
xxb16uws4#
出现此错误的一个原因可能是
package
目标被错误地执行了两次:当命令由不完善的脚本构建时可能发生:)