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

b1uwtaje  于 2022-11-02  发布在  Maven
关注(0)|答案(4)|浏览(206)

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

  • 无论是否存在任何类/资源,似乎都没有关系-无论如何都会出现上述错误消息。
  • 如果指定了两个目标(jartest-jar),也会出现此问题。
  • 如果没有指定目标,这个问题就不会出现。但是这不是一个选项,因为我确实需要jartest-jar

根据文档,classifier只需要在同一个目标的多次调用中指定,并且test-jar目标有一个合理的默认值,我不打算更改它。
此外,问题似乎没有出现在JAR插件的2.x行。
我错过了什么吗?谁能告诉我我做错了什么吗?
另外,Maven版本为3.3.9。

e4eetjau

e4eetjau1#

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的项目中有一个绑定到package阶段的默认执行。这个默认执行就是日志中提到的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

67up9zun

67up9zun2#

在我的例子中,我将执行ID设置为default-jar,覆盖默认的执行,然后错误就消失了。

<execution>
    <id>default-jar</id>
    <phase>package</phase>
    <goals>
        <goal>jar</goal>
    </goals>
</execution>
9udxz4iz

9udxz4iz3#

如果日志显示类似以下内容:

[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-09年中断,您可能希望尝试http://mail-archives.apache.org/mod_mbox/maven-users/201608.mbox/thread作为替代

xxb16uws

xxb16uws4#

出现此错误的一个原因可能是package目标被错误地执行了两次:

mvn ... package ... package

当命令由不完善的脚本构建时可能发生:)

相关问题