关于java:Maven-依赖树的解析规则

31次阅读

共计 990 个字符,预计需要花费 3 分钟才能阅读完成。

对于 Java 开发工程师来说,Maven 是依赖治理和代码构建的规范。遵循「约定大于配置」理念。Maven 是 Java 开发工程师日常应用的工具,本篇文章简要介绍一下 Maven 的依赖树解析。

依赖树结构

在 pom.xml 的 dependencies 中申明依赖包后,Maven 将间接引入依赖,并通过解析间接依赖的 pom.xml 将传递性依赖导入到以后我的项目,最终造成一个树状的依赖构造。

准则:深度优先遍历依赖,并缓存节点剪枝。比方下图:

  • A→B→D→E/F
  • A→C→D

在第二步 A→C→D 时,因为节点 D 曾经被缓存,所以会立刻返回,不用再次遍历 E /F,防止反复搜寻。

依赖抵触

然而如果 2 个包同时依赖了同一个 jar 包,然而这个 jar 包版本不同,规定是什么样的呢?比方下图 A 通过 B 和 D 引入了 1.0 版本的 E,同时 A 通过 C 引入了 2.0 版本的 E。针对这种多个版本构建依赖时,Maven 采纳「短门路优先」准则,即 A 会依赖 2.0 版本的 E。如果想引入 1.0 版本的 E,须要间接在 A 的 pom 中申明 E 的版本。

如果 Java 我的项目过于宏大,或者依赖传递过于简单时,能够应用 dependencyManagement 定义默认的版本号,一次定义全局失效,防止开发者自行治理依赖的版本。

依赖循环

比方:A 依赖了 B,同时 B 又依赖了 A。这种循环依赖可能不会间接浮现,然而可能会在一个很长的调用关系显现出来,也可能是模块架构的设计不合理。

咱们能够应用 mvn dependency:tree -Dverbose | grep cycle 来判断我的项目中是否存在「循环依赖」。

依赖排除

咱们能够应用 exclusion 来解决依赖抵触,然而 exclusion 会升高 Maven 依赖解析的效率,因为对应的 pom 文件不能缓存,每次都要从新遍历子树。

对于依赖排除:

  • exclusion 会造成依赖反复扫描和缓存。
  • 在间隔根节点越远的 exclusion,影响的范畴越小。
  • 依赖树高度越高,引入 exclusion 的代价越大。

依赖剖析

IDEA 插件

应用 IDEA 的话,能够在对应我的项目中右击,抉择 Diagrams -> Show Dependencies。

Maven 命令行

mvn dependency:tree -Dverbose

公众号

coding 笔记、点滴记录,当前的文章也会同步到公众号(Coding Insight)中,心愿大家关注 ^_^

代码和思维导图在 GitHub 我的项目中,欢送大家 star!

正文完
 0