java - Maven 依赖解析(冲突)

标签 java maven-2 maven

假设我有四个项目:

  • 项目 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/

相关文章:

java - 为什么 java.io.File 没有 close 方法?

java - 无法使用 BeanUtils 将一个类的属性复制到另一个类

java - 从 SQLite 数据库中检索图像并显示在 ListView 中

eclipse - M2Eclipse,META-INF/MANIFEST.MF

java - 如何将测试生成的源保留在生成的源目标文件夹之外

java - Eclipse m2e 插件似乎需要 org.eclipse.jem.util 0.0.0

java - 由于 "maven-metadata-bintray-central.xml"文件中的错误,Maven 构建失败

java - 原始数组上的 Lambda

eclipse - 无法计算构建计划 : Could not find artifact org. apache.maven.plugins :maven-resources-plugin:jar:2. 4.3

maven-2 - Maven Assembly 插件 - 多模块项目 - 源和 javadoc 未添加到 zip 文件