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

Xeo*_*eon 12 java maven-2 versions maven

我的项目依赖于commons-httpclient [2.0](编译).

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

依赖

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

java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.substringBeforeLast(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
Run Code Online (Sandbox Code Playgroud)

当我查看源代码时 - 在commons-lang 1.0.1中 - 实际上,没有StringUtils.substringBeforeLast(...)方法.为什么maven在commons-httpclient(编译)中使用commons-lang而在测试中不使用jbehave-core?

我不能在commons-httpclient中排除这个冲突的依赖,所以它必须保持编译时间.

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

Ale*_*exR 7

尝试定义<dependency>具有不同版本和范围的2个不同标签.<scope>test</scope>在依赖项中使用标记进行测试和<scope>compile</scope>编译.

  • 一个友好的警告 - 这不再适用于Maven 3(曾经对Maven 2有效).Maven 3将尝试获取最近的依赖项,有效地确保编译和测试阶段中只有一个编译或测试范围依赖项用于编译和测试阶段. (20认同)
  • @VineetReynolds那么如何使用Maven 3解决不兼容版本的问题? (3认同)
  • @StefanHaberl您可以尝试将测试移动到单独的maven模块并添加不同的依赖版本/范围. (2认同)