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

Java 具有测试范围的递归maven依赖项,java,maven,junit,Java,Maven,Junit,我有一个基础项目(通用)和几个依赖于通用的项目(P1,P2,…)。所有项目都有一些共同的依赖项,比如JUnit。为了避免复制公共依赖项,我将它们放在common pom.xml中 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version&g

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

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

朱尼特
朱尼特
4.10
测试
P1 POM取决于公共数据

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

com.example
常见的
0.0.1-快照
当我向P1添加JUnit测试用例时,eclipse显示“import org.JUnit无法解析”。但是,当我删除junit的common pom.xml中的“test”范围时,错误就被解决了


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

test
范围内的依赖关系永远不会是可转换的

您可以将
公共依赖项
拆分为
公共依赖项
公共测试依赖项

两者都在
编译
(默认)范围中包含它们的所有依赖项

现在,您包括了两个依赖项帮助程序,但测试依赖项本身在测试范围内

<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>

com.example
公共依赖项
0.0.1-快照
com.example
通用测试依赖项
0.0.1-快照
测试
compile->test
依赖项链解析为transisitive依赖项的
test
依赖项,因此您可以继续

如果需要,同样的技术也可以用于其他作用域

风格的两点:

    <> LI>如果公共也包含自己的代码,考虑将其拆分为依赖性部分和公共代码部分
  • 如果只使用依赖项pom项目,请始终将它们称为
    *-dependencies
    ,这样它们就更容易理解,而无需查看它们

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

(blackbuild的答案当然是正确的,但不是唯一的方法,有些人,比如我,不喜欢创建单独的模块来管理依赖项)

在根pom中定义:

<dependencyManagement>

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

朱尼特
朱尼特
4.10
测试
...
在所有子模块中,您都引用此依赖关系(版本和范围取自父pom.xml):


朱尼特
朱尼特

这无疑是最好、最直接的方法。然而,他明确地想把它们组合在一起。
  <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
  </dependencies>