假设我有四个项目:
- 项目 A(依赖于 B 和 D)
- 项目 B(依赖于 D)
- 项目 C(依赖于 D)
- 项目 D
在这种情况下,如果我运行项目 A,Maven 将正确地将依赖关系解析为 D。如果我理解正确,Maven 总是采用最短路径的依赖关系。由于 D 是 A 的直接依赖项,因此将使用它而不是 B 中指定的 D。
但现在假设这个结构:
- 项目 A(依赖于 B 和 C)
- 项目 B(依赖于 D)
- 项目 C(依赖于 D)
- 项目 D
在这种情况下,解决 D 的路径具有相同的深度。发生的事情是 Maven 会发生冲突。我知道可以告诉 Maven 他应该排除依赖项。但我的问题是如何解决这类问题。我的意思是在现实世界的应用程序中,你有很多依赖关系,也可能有很多冲突。
最佳实践解决方案真的是排除东西还是有其他可能的解决方案?当我突然收到 ClassNotFound 异常时,我发现很难处理,因为某些版本已更改,这导致 Maven 采用不同的依赖项。当然,知道了这个事实就更容易猜出问题是依赖冲突了。
我正在使用 maven 2.1-SNAPSHOT。
最佳答案
解决此类情况的 maven 方法是包含 <dependencyManagement>
项目根 pom 中的部分,您可以在其中指定将使用哪个版本的库。
编辑:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</dependencyManagement>
现在无论依赖项请求哪个版本的库 foo:bar,版本 1.2.3 将始终用于此项目和所有子项目。
引用:
关于java - Maven 依赖解析(冲突),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7175398/