具有测试范围的递归maven依赖项

时间:2014-03-26 09:30:41

标签: java maven junit

我有一个基础项目(常见)和几个依赖于常见的项目(P1,P2,...)。所有项目都有一些常见的依赖项,例如JUnit。为了避免复制公共依赖项,我将它们放在公共pom.xml

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>

P1 POM取决于常见的

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>common</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

当我向P1添加一个JUnit测试用例时,eclipse显示&#34;导入org.junit无法解析&#34;。但是,当我删除&#34;测试&#34;在junit的常见pom.xml中,错误已解决。

为什么没有正确处理递归依赖?我错过了什么?有没有更好的方法来处理常见的依赖关系?

2 个答案:

答案 0 :(得分:2)

test范围内的依赖关系永远不会是tranistive。

您可以做的是将common-dependencies分成common-dependenciescommon-test-dependencies

两者都包含compile(默认)范围内的所有依赖项。

现在,您既包含依赖项助手,又包括测试依赖项本身。

<dependency>
    <groupId>com.example</groupId>
    <artifactId>common-dependencies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.example</groupId>
    <artifactId>common-test-dependencies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <scope>test</test>
</dependency>

compile->test依赖关系链解析为traenitive依赖关系的test依赖关系,因此您可以继续使用。

如果需要,同样的技术也可以用于其他范围。

两种风格:

  • 如果common也包含自己的代码,请考虑将其拆分为依赖项部分和公共代码部分
  • 如果您使用仅依赖项目的pom项目,请始终将它们称为*-dependencies,以便在不查看它们的情况下更容易理解

答案 1 :(得分:0)

您还可以使用dependencyManagement使用不同的方法:

(blackbuild的答案肯定是正确的,但不是接近它的唯一方法,有些人,像我一样,不想创建单独的模块来管理依赖关系)。

在root pom中定义:

<dependencyManagement>

  <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
   ...
  </dependencies>
</dependencyManagement>

并且在所有子模块中引用此依赖项(版本和范围取自父pom.xml):

  <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
  </dependencies>