Maven 2 - 测试和编译中的不同依赖项版本

2022-09-04 04:10:26

我有一个依赖于commons-httpclient [2.0](编译)的项目。

我想写一些jbehave测试 - jbehave-core 3.4.5(测试)。这两个依赖关系都依赖于 commons-lang,但在不同的版本中 - 1.0.1 和 2.5。

dependency

当我执行mvn包时,我在测试部分得到[BUID失败]。我的测试用例在 surefire-plugin 输出中有一个例外:

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-lang from commons-httpclient (compile) 而不是 jbehave-core?

我不能在commons-httpclient中排除这种相互冲突的依赖关系,所以它必须保持在编译时。

那么如何解决这个问题 - commons-lang 2.5版本在测试中,1.0.1在编译时?


答案 1

Maven 3:

Maven 3 将尝试获取最接近的依赖项,从而有效地确保编译或测试范围的依赖项中只有一个同时用于编译和测试阶段。

(感谢维内特·雷诺兹)

Maven 2 (OLD):

尝试使用不同的版本和范围定义 2 个不同的标记。将依赖项内部的标记用于测试和编译。<dependency><scope>test</scope><scope>compile</scope>


答案 2

在 Maven 3 中,您可以通过在 groupId 之后添加一个点来欺骗 Maven

<dependency>
  <groupId>groupId.</groupId>
  <artifactId>artifactId</artifactId>
  <version>version1</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>groupId</groupId>
  <artifactId>artifactId</artifactId>
  <version>version2</version>
  <scope>compile</scope>
</dependency>

顺序在这里很重要。需要先进行测试,然后再编译。


推荐