对Jar的两个版本的依赖性

时间:2012-04-13 21:59:12

标签: maven maven-2

我有一个依赖于第三方库的模块X,而第三方库依赖于apache-commons-collections 2.1。

在模块X中,我想使用最新的apache-commons-collections 3.0,它有一些比2.1更多的方法。如果我向3.0添加一个依赖项,我猜这会产生一个问题,因为类加载器只是选择它在类路径中看到的第一个类。有没有办法解决这个问题?

谢谢, 小号

2 个答案:

答案 0 :(得分:1)

恕我直言,没有额外的模块化解决方案(如Java EE的EAR或OSGi),没有真正好的方法。不过我想你只是想问一下直接使用这个第三方库的简单web(或不是)模块。我担心你必须手动解决这个冲突。事实上,Maven不会提供commons-collections的2个版本并且依赖于类加载器的解析,而是解决依赖关系图并选择它认为最好考虑POM声明的版本。这意味着,如果您在模块X中声明commons-collections版本3.0的依赖性,那么将使用该版本,因为此声明比某些第三方lib的依赖项更重要。

这是Java平台本身的一个严重问题,它会像着名的JAR地狱那样引发问题。不幸的是,选择并声明commons-collections版本以满足您和您的第三方库是您的问题。

答案 1 :(得分:0)

只需将依赖项添加到您的项目3.0,它将优先于旧版本的2.1。要明确,您可以添加排除。在任何情况下,使用依赖插件以及分析和树目标来查看正在发生的事情。

长话短说......这种情况一直都会发生,并且会很好,无论如何你都可以控制发生的事情。