Maven JAR插件3.0.2错误:您必须使用分类器将补充工件附加到项目而不是替换它们

Ale*_*rov 24 java jar maven maven-jar-plugin

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>
Run Code Online (Sandbox Code Playgroud)

调用只是mvn package.

  • 是否存在任何类/资源似乎并不重要 - 无论如何都会出现上述错误消息.
  • 如果指定了两个目标(jartest-jar),也会出现问题.
  • 如果指定目标,则不会出现此问题.但这不是一个选择,因为我真的需要两个jartest-jar.

根据文档,classifier只需要在同一目标的多个调用中指定,并且对于test-jar我不打算更改的目标存在合理的默认值.

此外,问题似乎没有出现在JAR插件的2.x行上.

我错过了什么?有谁可以建议我做错了什么?

PS Maven版本是3.3.9.

Tun*_*aki 39

Jar插件实际上是使用配置执行两次:

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.0.2</version>
  <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

如果您使用这样的配置检查日志,您将具有以下内容:

[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] ------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这意味着插件实际上执行了两次.会发生什么,是Jar插件,在一个打包的项目中jar 有一个默认执行绑定到package阶段.此默认执行是ID为的日志中提到的执行default-jar.

当你<execution>在插件中配置一个时,你实际上配置了一个新的执行,其中jar将调用插件的目标.由于jar目标默认绑定到package阶段,因此在jar包装固有的默认绑定之后,该执行将在该阶段执行.而且由于插件已经运行,它失败了,因为再次运行它实际上会替换第一次运行期间已经产生的主要工件.在MJAR-198中的插件3.0.0版本中添加了此错误,因为发生此类事件很可能是错误配置,应尽早检测到.

因此,修复很简单:没有指定目标的执行,jar让默认的(来自jar包装)完成工作.jar由于默认执行,即使没有明确的目标配置,JAR仍将被创建.如果您还想要测试JAR,您仍然需要配置插件来执行以下操作:

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.0.2</version>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

但请注意,目标jar未指定.

  • 我仅在使用 jenkins 和 linux 的环境中的多模块设置中出现此错误。在 Mac OS 机器上运行,它们也在 Travis CI 环境中运行。似乎还有更多令人沮丧的诡计正在发生。恕我直言,错误消息比帮助更令人困惑,它只指向这篇 stackoverflow 文章。 (4认同)

Wol*_*ahl 9

如果您的日志显示如下内容:

[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ test --
[WARNING] JAR will be empty - no content was marked for inclusion!
Run Code Online (Sandbox Code Playgroud)

在 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作为替代


小智 7

就我而言,我已将执行的 ID 设置为 default-jar,然后错误消失了。例如

<execution>
    <id>default-jar</id>
    <phase>package</phase>
    <goals>
        <goal>jar</goal>
    </goals>
</execution>
Run Code Online (Sandbox Code Playgroud)

  • 这“有效”,但基于这样一个事实,即使用 `default-jar` 作为执行 ID 会覆盖 `jar` 包装中的默认执行。这是一个小技巧,有一个更好的解决方案。 (3认同)
  • 这不一定是黑客行为。想象一下,您想要运行默认的“jar”目标,但使用自定义配置。在这种情况下,匹配 ID `default-jar` 就成为合法的用例:` &lt;execution&gt; &lt;id&gt;default-jar&lt;/id&gt; &lt;goals&gt; &lt;goal&gt;jar&lt;/goal&gt; &lt;/goals&gt; &lt;configuration&gt; &lt;skipIfEmpty&gt;true&lt;/skipIfEmpty&gt; &lt;/配置&gt; &lt;/执行&gt;` (2认同)