Maven JAR Plugin 3.0.2 错误:您必须使用分类器将补充工件附加到项目而不是替换它们
Posted
技术标签:
【中文标题】Maven JAR Plugin 3.0.2 错误:您必须使用分类器将补充工件附加到项目而不是替换它们【英文标题】:Maven JAR Plugin 3.0.2 Error: You have to use a classifier to attach supplemental artifacts to the project instead of replacing them 【发布时间】:2017-04-19 06:29:18 【问题描述】: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
。
根据documentation,classifier
只需要在同一个目标的多次调用上指定,test-jar
目标有一个合理的默认值,我不打算更改。
另外,JAR 插件的 2.x 行似乎没有出现问题。
我错过了什么吗? 有人可以建议我做错了什么吗?
附: Maven 版本是 3.3.9。
【问题讨论】:
【参考方案1】:Jar 插件实际上是通过配置执行了两次:
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
如果你用这样的配置检查日志,你会得到类似的东西:
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ test ---
[INFO] Building jar: ...\test\target\test-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default) @ test ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
意味着插件实际上被执行了两次。发生的情况是 Jar 插件,在一个项目中,该项目的包装为 jar
has a default execution bound to the package
phase。此默认执行是日志中提到的 ID 为 default-jar
的执行。
当您在插件中配置<execution>
时,您实际上配置了一个新的执行,其中将调用插件的jar
目标。自jar
goal binds by default to the package
phase 以来,该执行将在该阶段执行,在jar
包装固有的默认绑定之后。而且由于插件已经运行,它失败了,因为再次运行它实际上会替换第一次运行期间已经产生的主要工件。这个错误是在MJAR-198插件的3.0.0版本中添加的,因为发生这种情况很可能是配置错误,应该尽早检测到。
因此,修复很简单:没有指定目标jar
的执行,而让默认的执行(来自jar
包装)完成工作。由于默认执行,即使没有明确配置 jar
目标,仍将创建 JAR。如果你也想要一个测试 JAR,you will still need to configure the plugin to do that 使用:
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
但请注意,没有指定目标jar
。
【讨论】:
感谢您的解释 - 即使我将包装设置为“war”(而不是“jar”),但删除了 jar 中的在我的例子中,我将执行的 ID 设置为 default-jar,然后错误就消失了。例如
<execution>
<id>default-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
【讨论】:
这“有效”,但基于将default-jar
作为执行ID 覆盖jar
包装的默认执行这一事实。这有点小技巧,有更好的解决方案。
这不一定是 hack。想象一下,您想运行默认的 jar
目标,但使用自定义配置。在这种情况下,匹配 ID default-jar
成为合法用例:` 如果您的日志显示如下内容:
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ test --
[WARNING] JAR will be empty - no content was marked for inclusion!
在 src/main/java 中添加一个无用的类似乎可以解决问题,请参阅:
http://maven.40175.n5.nabble.com/quot-mvn-clean-verify-deploy-quot-causes-jar-plugin-to-execute-twice-td5877166.html
由于上述链接可能在 2021 年 9 月被破坏,您可能想尝试http://mail-archives.apache.org/mod_mbox/maven-users/201608.mbox/thread 作为替代
【讨论】:
感谢您的链接!还提到了调用 mvn clean verify deploy 的情况,它会执行所有操作,直到验证两次。在我的情况下, mvn clean install deploy 坏了,但 mvn clean deploy 工作。 (也有一个空的 JAR。) 链接好像坏了 @Sniper - 感谢我尝试为邮件列表存档寻找替代来源以上是关于Maven JAR Plugin 3.0.2 错误:您必须使用分类器将补充工件附加到项目而不是替换它们的主要内容,如果未能解决你的问题,请参考以下文章
maven打包插件maven-assembly-plugin
解决:Failure to transfer org.apache.maven.plugins:maven-jar-plugin:pom:2.4 from错误
构建项目时出现错误,无法执行目标 org.apache.maven.plugins:maven-javadoc-plugin:2.10.4:jar (attach-javadocs)
无法在项目上执行目标 org.apache.maven.plugins:maven-compiler-plugin (default-compile):致命错误编译:未找到 tools.jar
无法在 org.apache.maven.plugins:maven-dependency-plugin:jar:2.10 收集依赖项