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

时间:2011-07-04 20:19:26

标签: java maven-2 maven versions

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

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

dependency

当我执行 mvn package 时,我在测试部分得到[BUID FAILURE]。 在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-httpclient(编译)中使用commons-lang而在测试中不使用jbehave-core?

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

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

3 个答案:

答案 0 :(得分:6)

尝试使用不同的版本和范围定义2个不同的<dependency>标记。在测试中依赖标记<scope>test</scope>,编译使用<scope>compile</scope>

答案 1 :(得分:0)

在 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>

这里的顺序很重要。需要先测试再编译。

答案 2 :(得分:-1)

为编译和测试依赖项提供两个不同的版本是一个非常糟糕的主意:

您的非测试代码可能依赖于较新JAR的行为,并且在使用较旧JAR的类时会失败。 在测试中使用较旧的JAR时,非测试代码将使用旧JAR失败。

否则你可以在任何地方使用旧的JAR,使用相同的版本...... 如果将两个JAR版本都放入类路径中,则无法知道在运行测试时哪个版本被拾取。这也是一个坏主意。

因此,您应该对相同的JAR版本依赖项进行非测试和测试。