2013-06-27 203 views
3

一个由一些模块组成的maven项目。我的一个模块正在使用Google版本11.0.2的番石榴依赖项。现在我正在使用番石榴但是版本为14的项目中集成了另一个模块。Maven依赖冲突

所以我想新的模块使用番石榴版本14但剩余的项目使用番石榴版本11.0.2。我曾尝试将番石榴的<exclusion></exclusion>添加到新模块中,但它不起作用。

任何提示来解决这个问题。

更新:@Guillaume Darmont的答案解决了不同模块的问题。但现在我的问题是,新的模块有2个依赖项,其中一个使用番石榴11.0.2和其他使用14.0。如何管理这个。我们可以在模块的pom中分别指定应该使用哪种番石榴版本。

+0

我没有完全理解你的问题。你正试图在两个模块上使用Guava'14'?另外,您是否使用共同父母POM? –

+0

我想在我正在整合的新模块上使用番石榴14。旧的模块将仅使用番石榴11.0.2。是的,我有一个commmon父母POM。 –

+0

你确定11.0.2和14可以共存吗?在正常情况下,将只使用其中一个库(首先出现在类路径中)。 –

回答

4

正如我理解你的问题,你可以在你的新模块的pom.xml添加为guava一个<dependencyManagement>

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>14.0.1</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 
+0

欣赏回答。它适用于上述情况。是否可以在单个模块中使用不同版本的依赖关系。我的意思是新模块有2个依赖关系,其中一个使用番石榴'11.0.2'和'14.0'。如何管理这个。 –

+0

不,这是不可能的。 Maven模块中的所有类共享相同的类路径。顺便说一句,你只需要为你的项目的所有模块提供一个番石榴版本。番石榴14应该大部分(如果不totaly)向后兼容版本11. –

5

mvn dependency:tree命令将帮助确定哪个模块带来了Guava 14 jar文件。

+2

更具体地说,'mvn依赖项:tree -Dverbose -Dincludes = com.google.guava'将显示_just_您感兴趣的依赖关系树的各个部分,并且包含关于为什么每个依赖项被忽略(冲突/重复)的细节案件。 [Apache Maven项目 - 使用依赖关系树解决冲突](http://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html) –

0

首先尝试mvn dependency tree并检查输出有可能是11.0.2已经从及物动词多个被引用比你的一个项目依赖性,你将需要添加排除所有依赖直接/间接拉下你想排除的特定番石榴版本。

其次解决这个冲突可能不是直接的。看看版本号的转换(11到14)听起来像是一个重大的转变,你可能有更好的机会保持14版本和不包括11的东西。

如果版本变更与您的应用程序不兼容,您几乎别无选择,只能使用类似OSGi的东西来确保您可以在项目中运行相同库的不同版本。

+0

...或Maven阴影插件与包重定位 –