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

为什么“ MVN编译”需要“测试罐”依赖项

毛博
2023-03-14
问题内容

test-jar在多模块项目中使用依赖项时遇到麻烦。例如,当我声明cleartk-syntax模块依赖于这样的cleartk- token模块时test-jar(完整代码在此处):

<modelVersion>4.0.0</modelVersion>
<groupId>org.cleartk</groupId>
<artifactId>cleartk-syntax</artifactId>
<version>0.5.0-SNAPSHOT</version>
<name>cleartk-syntax</name>
...
<dependencies>
    ...
    <dependency>
        <groupId>org.cleartk</groupId>
        <artifactId>cleartk-token</artifactId>
        <version>0.7.0-SNAPSHOT</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>

如果我mvn compile使用Maven 2 运行,则会出现以下错误:

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) org.cleartk:cleartk-token:test-jar:tests:0.7.0-SNAPSHOT

如果我使用Maven 3,则会收到错误消息:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.654s
[INFO] Finished at: Mon Jan 24 21:19:17 CET 2011
[INFO] Final Memory: 16M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project cleartk-syntax: Could not resolve
dependencies for project org.cleartk:cleartk-syntax:jar:0.5.0-SNAPSHOT: Could
not find artifact org.cleartk:cleartk-token:jar:tests:0.7.0-SNAPSHOT

在后一种情况下,我特别困惑,因为我认为它应该在寻找type test-jar而不是type 的工件jar

使用maven 2或maven 3,可以通过运行进行编译mvn compile package -DskipTests。使用maven
3,我还可以通过运行进行编译mvn compile test-compile

但是,为什么test-jar在该compile阶段中,maven 2或maven 3寻找依赖关系?它不应该等到test- compile阶段来寻找这种依赖性吗?

更新: 答案是,在我的编译阶段使用的maven-exec-plugin
需要对scope:test中的工件进行依赖项解析。我创建了一个功能请求,以删除scope:test依赖项。


问题答案:

在我看来,这似乎是个确定的错误。

我有同样的问题,并测试了Maven 3.0.1和3.0.2。验证不会失败,只有编译步骤会失败。随着Maven 3 mvn compile休息,但mvn test-compile可以。

看起来编译阶段正在反应器中寻找测试罐工件,然后在仓库中进行回购,但不应这样做,因为依赖项在测试范围内。测试范围工件应在测试编译而不是编译期间解决。

结果,我认为可以通过将Maven-compiler-plugin的testCompile目标映射到编译阶段而不是默认的test-compile阶段来解决。

我将其添加到pom中,紧接在上游pom中添加测试罐创建的部分旁边:

  <!-- there is a bug in maven causing it to resolve test-jar types
       at compile time rather than test-compile. Move the compilation 
       of the test classes earlier in the build cycle -->
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
      <execution>
        <id>default-testCompile</id>
        <phase>compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

但这也不起作用,因为在编译和测试-编译之间的五个阶段都没有运行并设置诸如测试类路径之类的东西。

我猜在修正此错误之前,真正的解决方法是使用test-compile代替compile



 类似资料:
  • 我想知道为什么我的简单spring boot项目不再有效。它基本上直接来自spring示例,其中一个控制器说hello world。我使用的是spring boot starter jetty和spring boot v1.1.10(也尝试了1.2.0)。我有一些使用嵌入式solr的单元测试,所以solr核心被标记为<代码> 我认为测试范围的依赖关系不应该干扰编译范围的依赖关系,并且“仅适用于测试

  • 嗨, 我是Spring boot gradle项目的新手。我正在尝试用Spring boot应用程序运行flyway迁移。这就是我在gradle中设置依赖项的方式, 首先,我将依赖项添加为。这足以暴露一个终点。 然后我尝试以的方式添加flyway依赖项,它既没有抛出错误,也没有运行迁移脚本,直到我添加了依赖项。在查看了data-jpa jar的pom.xml之后,我确定了这个jar的hiberna

  • 当我为我的项目运行“mvn dependency:tree”时,它会显示以下内容: 正如您在标记行中看到的,xml API具有“编译”作用域,因此它被打包到。战争档案。为什么会这样? 更有趣的是,它只在使用Java5时发生,对于Java6,依赖项显示为“test”。 Maven版本:3.0.4

  • 目前我的项目使用Spring启动测试如下: 但是,尽管有测试范围,它还是引入了sping-core(这是此版本中易受攻击的tpl)作为编译范围传递依赖项,并且它出现在我编译的二进制文件中。 我知道我可以通过使用测试范围显式拉动Spring核心来解决这个问题: 然而,这不应该是必要的。为什么只有在将依赖项拉入编译范围的测试中才有依赖项?

  • 本文向大家介绍什么是预编译,何时需要预编译:相关面试题,主要包含被问及什么是预编译,何时需要预编译:时的应答技巧和注意事项,需要的朋友参考一下 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

  • 我正在通过Kafka快速入门: http://kafka.apache.org/07/quickstart.html 和基本的消费者群体示例: https://cwiki.apache.org/confluence/display/KAFKA/Consumer组示例 我已经将消费者和消费者线程池编码如下: 其他几个方面:我正在使用Spring来管理我的动物园管理员: 我正在用Maven和OneJa