java - dependencyManagement 的传递效应

标签 java maven dependency-management transitive-dependency

在 Maven 中,您可以通过 dependencyManagement 中的条目覆盖传递依赖项的版本号,因为 dependencyManagement 优先于传递依赖项定义。

但是(传递)依赖项的 pom 中的 dependencyManagement 定义呢?他们被考虑了吗?如果是这样,它们覆盖了什么,它们是如何被覆盖的?

最佳答案

依赖管理暗示是可传递的。不需要为此制定特殊规则,而是已经提到的规则的结果:Transitive Dependencies .

考虑这个示例结构:

  • 你的模块
    • A - 依赖
      • D - 传递依赖
    • B - 依赖
      • D - 传递依赖

AB 构建时,它们相应的 dependencyManagement 部分被检查以选择 D 的版本,如果没有明确指定。 这是重要的部分:AB 用作依赖项以确定 D< 的版本时,使用完全相同的过程 他们依赖。因此,它们不会以任何方式相互影响。

例如,这可能导致 A 取决于 D:1.0,而 B 取决于 D:1.1,它们的 dependencyManagement 部分已经在此时应用以确定这一点,将不再考虑。将此信息作为输入,应用依赖调解规则为您的模块只选择一个版本的 D

依赖调解规则也在链接页面中描述。但简而言之,最接近的定义获胜,平局根据顺序被打破。自然地,模块本身中的定义总是最接近的。

现在假设您的模块被用作依赖项。由于 dependencyManagement 部分中的定义,您的项目可能依赖于基于上述所有规则的 D:1.2,但这就是您的 dependencyManagement结束。

(请注意,import 作用域是一个异常(exception),因为它的行为与其他作用域完全不同。)

关于java - dependencyManagement 的传递效应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38824870/

相关文章:

java - maven - 两个模块可以使用同一库的不同版本

iOS依赖管理和打包

RedHat Linux 5 上的 Java 安装

java - org.springframework.boot.web.support 不存在

java - 运行 cucumber 测试时,为什么会跳过它们?

maven - 如何将 Sonatype Nexus 存储库组与 Github 原始存储库结合使用?

java - 如何获取在 Java 中从给定方法调用的另一个类中定义的方法列表

java - 空指针异常 : element cannot be mapped to a null key

java - 如何使用 java 程序更改 eclipse 工作区位置

java - 我的 Lucene 搜索未返回结果