java - Maven:测试与传递编译

标签 java maven

假设我对 jar A 有编译依赖,而 jar A 对 B 有编译依赖。此外,我的测试对 B 有依赖。

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

什么是“类似 Maven”的解决方案?

示例:

如果我只有

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

那么我的依赖项:列表是:

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>

然后我得到依赖项:列表

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 中的任何内容,则第一个版本可以编译,而第二个版本则不能。额外的测试依赖项“隐藏”了传递编译依赖项。

最佳答案

还没有遇到过这种情况,但如果我理解你的问题,你的测试所需的依赖项 B 的版本和依赖项 A 所需的依赖项 B 的版本会有所不同。如果版本相同,那么您就不会遇到此问题。

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

关于java - Maven:测试与传递编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40461621/

相关文章:

java - 我遇到此错误 java.lang.NullPointerException : Attempt to invoke interface method 'int java.util.List.size()' on a null object reference

java - 在 Java 中对我自己类型的数组列表进行排序

java - RecyclerView 中的背景颜色变化不一致?

hibernate - Tomcat 7 应用程序和 derby 数据库之间的连接出现问题。

maven - 将 Twitter Bootstrap 文件放在 maven 项目中的什么位置?

java - while 循环内的 switch - 缺少 return 语句

java - 抽象类中的构造函数有什么用?

java - NoClassDefFoundError for dependent library projects in Android app project(使用maven作为构建工具)

java - bean 类的完全限定名称,除非它仅用作子 bean 定义的父定义

testing - maven测试找不到资源