当前位置: 首页 > 面试题库 >

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

赵雅懿
2023-03-14
问题内容

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

  • 根本没有任何类/资源似乎并不重要-仍然出现上述错误消息。
  • 如果指定了两个目标(jartest-jar),也会出现此问题。
  • 如果 指定 目标, 则不会出现该问题。但这不是一个选择,因为我确实需要jartest-jar

根据文档,classifier仅需要在同一目标的多个调用上指定该目标,并且该目标有一个合理的默认值test- jar,我不打算更改。

另外, 该问题似乎并未出现在JAR插件的2.x行上。

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

PS Maven版本是3.3.9。


问题答案:

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 具有绑定到packagephase
的默认执行
。此默认执行是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>

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



 类似资料:
  • 我将脚本中工作的 jsonschema 转换为 YAML 格式,以便使用 swagger 文档。问题是在第8行(-type:字符串)中,swagger显示错误:应该是对象,“项目”必须是对象。 Json模式

  • 问题内容: 我有以下代码: 我想用新内容替换文件中的旧内容。但是,当我执行代码时,将附加文件“ test.xml”,即,我的旧内容被新的“替换”内容所取代。为了删除旧内容而只保留新内容,我该怎么办? 问题答案: 您需要先写入文件的开头,然后再使用(如果要进行就地替换): 另一种方法是读取文件,然后使用再次打开它: 无论是也将改变inode的文件的数量(我测试过两次,一次是与Ubuntu 12.04

  • 如果我用MockBean替换Autowired的话,它是有效的,但我不知道为什么

  • 问题内容: 我正在逐步用React替换一些Backbone视图。 我的React视图: 我需要在其他html元素下方呈现React视图而不替换它们。 我希望我的方法可以替换占位符,而不是插入占位符,以便: 可能导致: 代替: 没有重复出现在Jquery上,有没有正确的方法呢? 问题答案: 您不需要jQuery来解决此问题。 您只需要渲染到临时DIV中并提取内容并替换现有元素即可。我添加了,以便可以

  • 系统检查未发现任何问题(0已沉默)。 您有18个未应用的迁移。您的项目可能无法正常工作,直到您为应用程序应用迁移:admin、auth、contenttypes、sessions。运行'Python Manage.py Migrate'来应用它们。2021年2月17日-19:52:27 Django版本3.1.6,使用设置'felix.settings'启动开发服务器http://127.0.0.

  • 我来自Maven背景,对Gradle非常陌生。以下是上下文。 我有一个图书馆项目 LibraryStarter 需要将其导入到 图书馆用户 项目。 这两个都是spring boot的项目和建筑 无法使用分级分发“https://services.Gradle.org/distributions/gradle-6.6.1-bin.zip”运行分阶段生成操作。生成文件“C:\work\learn\us