Maven:测试与传递编译

时间:2016-11-07 09:21:36

标签: java maven

假设我对jar A有一个编译依赖,它对B有一个编译依赖。此外,我的测试依赖于B.

当我声明对B的“测试”依赖时,这似乎覆盖了对B的传递编译依赖性,因此我无法再编译我的项目。如果我遗漏B,一切都有效,但感觉很奇怪,因为我直接使用了传递依赖。

对此,什么是“Maven-like”解决方案?

实施例

如果我只有

<dependency>
  <groupId>commons-httpclient</groupId>
  <artifactId>commons-httpclient</artifactId>
  <version>3.1</version>
</dependency>

然后我的依赖:list是:

commons-codec:commons-codec:jar:1.2:compile
commons-httpclient:commons-httpclient:jar:3.1:compile
commons-logging:commons-logging:jar:1.0.4:compile

树是:

      --- maven-dependency-plugin:2.8:tree (default-cli) @ testcompile ---
      de.continentale.spu:testcompile:jar:0.0.1-SNAPSHOT
      \- commons-httpclient:commons-httpclient:jar:3.1:compile
         +- commons-logging:commons-logging:jar:1.0.4:compile
         \- commons-codec:commons-codec:jar:1.2:compile

如果我使用

<dependency>
  <groupId>commons-httpclient</groupId>
  <artifactId>commons-httpclient</artifactId>
  <version>3.1</version>
</dependency>
<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.0.4</version>
  <scope>test</scope>
</dependency>

然后我得到了依赖:list

commons-codec:commons-codec:jar:1.2:compile
commons-httpclient:commons-httpclient:jar:3.1:compile
commons-logging:commons-logging:jar:1.0.4:test

树是:

--- maven-dependency-plugin:2.8:tree (default-cli) @ testcompile ---
de.continentale.spu:testcompile:jar:0.0.1-SNAPSHOT
+- commons-httpclient:commons-httpclient:jar:3.1:compile
|  \- commons-codec:commons-codec:jar:1.2:compile
\- commons-logging:commons-logging:jar:1.0.4:test

因此,commons-logging改变了它的范围,不再用于编译。

EDIT2:如果我在src / main / java中使用commons-logging中的任何内容,那么第一个版本编译而第二个版本不编译。附加的测试依赖性“隐藏”了传递性编译依赖性。

1 个答案:

答案 0 :(得分:-1)

没有遇到过这样的情况,但是如果我理解你的问题是你的测试所需的依赖关系B的版本,那么依赖关系A所要求的就是不同的。如果版本相同,那么您将不会遇到此问题。

在这种情况下,您可以使用Maven提供的Dependency Scope功能。让依赖关系A获取其所需版本的依赖关系B,并在您的pom中使用范围test声明一个单独的依赖关系B.这意味着它的使用仅限于测试。您可以了解更多here