Maven 依赖关系解决(冲突)

2022-08-31 12:07:02

假设我有四个项目:

  • 项目 A(依赖于 B 和 D)
  • 项目 B(依赖于 D)
  • 项目 C(依赖于 D)
  • 项目 D

在这种情况下,如果我运行项目 A,Maven 将正确地将依赖项解析为 D。如果我理解正确,Maven总是采用最短路径的依赖关系。由于 D 是 A 的直接依赖关系,因此将使用 D,而不是在 B 中指定的 D。

但现在假设这个结构:

  • 项目 A(依赖于 B 和 C)
  • 项目 B(依赖于 D)
  • 项目 C(依赖于 D)
  • 项目 D

在这种情况下,解析 D 的路径具有相同的深度。发生的事情是,Maven将发生冲突。我知道可以告诉Maven他应该排除依赖关系。但我的问题是如何解决这类问题。我的意思是,在现实世界的应用程序中,你有很多依赖关系,也可能有很多冲突。

最佳实践解决方案是否真的排除了某些内容,或者是否有其他可能的解决方案?当我突然得到一个ClassNotFound异常时,我发现很难处理,因为一些版本已经改变,这导致Maven采用不同的依赖关系。当然,知道这个事实可以更容易地猜测问题是依赖关系冲突。

我正在使用maven 2.1-SNAPSHOT。


答案 1

解决此类情况的 maven 方法是在项目的根 pom 中包含一个部分,您可以在其中指定将使用哪个库的版本。<dependencyManagement>

编辑:

<dependencyManagement>
  <dependencies>
    <dependency>
        <groupId>foo</groupId>
        <artifactId>bar</artifactId>
        <version>1.2.3</version>
    </dependency>
   </dependencies>
</dependencyManagement>

现在,无论依赖项请求哪个版本的库 foo:bar,版本 1.2.3 将始终用于此项目和所有子项目。

参考:


答案 2

Maven可以处理这两种情况而不会发生任何冲突。当需要两个版本的可传递依赖项时,将存在冲突。你描述的应用(或依赖项)尝试使用实际使用的冲突依赖项版本中不可用的类的结果。有多种方法可以解决此问题。ClassNotFoundException

  1. 更新您正在使用的依赖于冲突依赖项的库的版本,以便它们都依赖于该依赖项的相同版本
  2. 将冲突的依赖项声明为项目的直接依赖项,其中包含要包含的版本(在示例中,包含缺少类的版本)
  3. 通过 POM 部分指定传递依赖项应使用的冲突依赖项的版本<dependencyManagement>
  4. 使用<exclusion>

推荐