Maven依赖冲突

6
一个包含多个模块的Maven项目。其中一个模块使用了谷歌版本为11.0.2的guava库。现在我要集成另一个模块,它也使用了guava库,但版本是14
所以我希望新模块使用guava版本14,而其余项目仍然使用guava版本11.0.2。我尝试将guava的<exclusion></exclusion>添加到新模块中,但没有起作用。
有什么解决方法吗?
更新:@Guillaume Darmont的回答解决了不同模块之间的问题。但现在我的问题是,新模块有两个依赖项,其中一个使用了guava 11.0.2,另一个使用了14.0。如何处理这种情况?我们可以在模块的pom文件中单独指定使用哪个版本的guava库吗?

我没有完全理解你的问题。你是在两个模块上都尝试使用Guava 14吗?另外,你是否使用了一个共同的父POM? - Guillaume Darmont
我想在新模块中使用Guava 14,这是我正在集成的。旧模块仅使用Guava 11.0.2。是的,我有一个共同的父POM。 - Amol Sharma
你确定11.0.2和14两个版本可以共存吗?在正常情况下,只有一个库(出现在类路径中的第一个)会被使用。 - Kalpak Gadre
3个回答

6
按照我的理解,您可以在新模块的pom.xml中添加一个标签,并针对guava进行配置:
<dependencyManagement>
  <dependencies>
      <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>14.0.1</version>
      </dependency>
  </dependencies>
</dependencyManagement>

感谢您的回答。它可以解决提到的问题。在单个模块中使用不同版本的依赖项是否可能?我的意思是,新模块有两个依赖项,其中一个使用guava 11.0.214.0。如何管理这个问题。 - Amol Sharma
不,这是不可能的。Maven模块中的所有类共享相同的类路径。顺便说一句,为了简化您的依赖关系,您应该在项目的所有模块中仅使用一个版本的Guava。 Guava 14与版本11大多数情况下(如果不是全部)向后兼容。 - Guillaume Darmont
maven-shade-plugin可以用于将一个构件中的包重新映射到另一个位置,这样您可以以一种方式使用一个版本,而以正常方式使用另一个版本。然而,这样做可能会大大增加部署的大小(无论是一个大型JAR文件还是单独打包的文件),并且往往会导致过时的依赖关系和潜在问题,特别是当它们使用服务加载器或类似机制时。 - undefined

6

mvn dependency:tree命令将帮助确定哪个模块正在引入Guava 14 jar文件。


2
更具体地说,mvn dependency:tree -Dverbose -Dincludes=com.google.guava 将仅显示您感兴趣的依赖关系树部分,并包括有关为什么在每种情况下省略依赖项(冲突/重复)的详细信息。Apache Maven 项目 - 使用依赖关系树解决冲突 - Sean Connolly

0
首先尝试使用mvn dependency tree命令并检查输出结果,可能会发现11.0.2已经被多个项目依赖传递引用,因此您需要在所有直接或间接拉取特定Guava版本的依赖项中添加排除项。
其次,解决这个冲突可能并不容易。从版本号转换(从11到14)来看,这似乎是一个重大的转变,您可能更有机会保留14版本并排除11版本。
如果版本更改与您的应用程序不兼容,则几乎没有选择,只能使用类似于OSGi的东西来确保您可以在项目中运行同一库的不同版本。

...或使用Maven Shade插件进行包重定位。 - Andrei Savu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接