我的项目依赖于 commons-httpclient [2.0](编译)。
我想编写一些 jbehave 测试 - jbehave-core 3.4.5(测试)。 这两个依赖项都依赖于 commons-lang 但版本不同 - 1.0.1 和 2.5。
当我执行 mvn package 时,我在测试部分得到 [BUID FAILURE]。 我的测试用例在 surefire-plugin 输出中有一个异常(exception):
java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.substringBeforeLast(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
正如我查看源代码 - 在 commons-lang 1.0.1 中 - 实际上,没有 StringUtils.substringBeforeLast(...) 方法。 为什么 maven 在测试中使用来自 commons-httpclient(编译)而不是来自 jbehave-core 的 commons-lang?
我无法在 commons-httpclient 中排除这种相互冲突的依赖关系,因此它必须保留在编译时。
那么如何解决这个问题——测试中的 commons-lang 2.5 版本和编译时的 1.0.1 版本?
最佳答案
maven 3:
Maven 3 将尝试获取最近的依赖项,有效地确保在编译和测试阶段只使用编译或测试范围的依赖项之一。
(感谢 Vineet Reynolds)
Maven 2(旧):
尝试定义 2 个不同的 <dependency>
具有不同版本和范围的标签。使用标签 <scope>test</scope>
测试和 <scope>compile</scope>
的内部依赖关系用于编译。
关于java - Maven 2 - 测试和编译中的不同依赖版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6575742/