假设我对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中的任何内容,那么第一个版本编译而第二个版本不编译。附加的测试依赖性“隐藏”了传递性编译依赖性。
答案 0 :(得分:-1)
没有遇到过这样的情况,但是如果我理解你的问题是你的测试所需的依赖关系B的版本,那么依赖关系A所要求的就是不同的。如果版本相同,那么您将不会遇到此问题。
在这种情况下,您可以使用Maven提供的Dependency Scope
功能。让依赖关系A获取其所需版本的依赖关系B,并在您的pom中使用范围test
声明一个单独的依赖关系B.这意味着它的使用仅限于测试。您可以了解更多here