【问题标题】:Maven Dependency ConflictMaven 依赖冲突
【发布时间】:2013-06-24 11:43:28
【问题描述】:

由一些模块组成的 Maven 项目。我的模块之一是使用谷歌版本11.0.2 的番石榴依赖项。现在我正在我的项目中集成另一个模块,它也使用番石榴,但版本为14。

所以我希望新模块使用番石榴版本14,但其余项目使用番石榴版本11.0.2。我曾尝试将<exclusion></exclusion> 的番石榴添加到新模块中,但没有奏效。

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

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

【问题讨论】:

  • 我没有完全理解你的问题。您正在尝试在两个模块上使用 Guava 14 吗?另外,你使用公共的父 POM 吗?
  • 我想在我正在集成的新模块上使用 guava 14。较旧的模块将仅使用 guava 11.0.2。是的,我有一个共同的父 POM。
  • 你确定11.0.2和14可以共存吗?在正常情况下,只会使用其中一个库(在类路径中首先出现)。

标签: java maven dependencies project-management pom.xml


【解决方案1】:

据我了解,您可以在新模块 pom.xml 中为guava 添加<dependencyManagement>:

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

【讨论】:

  • 欣赏答案。它适用于上述情况。是否可以在单个模块中使用不同版本的依赖项。我的意思是新模块有 2 个依赖项,其中一个是使用 guava 11.0.2 和 14.0。如何管理。
  • 不,这是不可能的。 Maven 模块中的所有类共享相同的类路径。顺便说一句,为了简化您的依赖关系,您的项目的所有模块应该只有一个版本的番石榴。 Guava 14 应该大部分(如果不是完全)向后兼容版本 11。
【解决方案2】:

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

【讨论】:

【解决方案3】:

首先尝试mvn dependency tree 并检查输出,11.0.2 可能已从多个项目依赖项中传递引用,您需要直接/间接为所有依赖项添加排除项,拉下特定的番石榴您尝试排除的版本。

第二次解决这个冲突可能不是直截了当的。查看版本号转换(11 到 14)对我来说听起来像是一次重大转换,您可能有更好的机会保留 14 版本并排除 11 的东西。

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

【讨论】:

  • ...或带有包重定位的maven shade插件
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 2013-07-20
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多