Maven JAR 插件(版本 3.0.2)不断抛出以下错误, 即使是单次调用 jar
目标也是如此:
[错误]无法在项目测试中执行目标 org.apache.maven.plugins:maven-jar-plugin:3.0.2:jar(默认):您必须使用分类器将补充工件附加到项目而不是替换它们. -> [帮助 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 行上。
我错过了什么?有人可以建议我做错了什么吗?
PS Maven 版本是 3.3.9。
原文由 Alex Shesterov 发布,翻译遵循 CC BY-SA 4.0 许可协议
Jar 插件实际上使用配置执行了两次:
如果你用这样的配置检查日志,你会得到类似的东西:
这意味着该插件实际上被执行了两次。发生的情况是,Jar 插件在一个包装为
jar
的项目中 有一个默认执行绑定到package
阶段。此默认执行是日志中提到的 ID 为default-jar
的执行。当您在插件中配置
<execution>
时,您实际上配置了一个新的执行,其中jar
插件的目标将被调用。由于jar
目标默认绑定到package
阶段,该执行在该阶段执行,在jar
固有的默认绑定之后由于插件已经运行,所以它失败了,因为再次运行它实际上会替换第一次运行期间已经生成的主要工件。这个错误是在 MJAR-198 插件的 3.0.0 版本中添加的,因为发生这种情况很可能是配置错误,应该及早发现。因此,修复很简单:不要执行指定目标
jar
,让默认的执行(来自jar
包装)完成工作。由于默认执行,即使没有显式配置jar
目标,JAR 仍将被创建。如果您还想要一个测试 JAR, 您仍然需要配置插件来执行此操作:但请注意,未指定目标
jar
。