学习
实践
活动
专区
工具
TVP
写文章
专栏首页二进制文集Maven 依赖树的解析规则
原创

Maven 依赖树的解析规则

对于 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

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • Maven 依赖调解源码解析(一):开篇

    相信久经沙场的 Java 开发同学们,一定对 Maven 这个工具不陌生。Maven 的依赖调解原则,便是经常聊到的话题。它是为了解决 groupId 和 ar...

    xiaoxi666
  • Maven的依赖管理 - 引入依赖

    导入依赖坐标,无需手动导入jar包就可以引入jar。在pom.xml中使用<dependency>标签引入依赖。

    Devops海洋的渔夫
  • Maven的依赖配置

    根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:

    程序员云帆哥
  • Maven 依赖调解源码解析(三):传递依赖,路径最近者优先

    A有这样的依赖关系:A->B->C->X(1.0)、A->D->X(2.0),X是A的传递性依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被Maven解析...

    xiaoxi666
  • Maven 依赖调解源码解析(六):dependencyManagement 版本锁定

    我们在根模块 mavenDependencyDemo 中,用 dependencyManagement 的形式直接指定 X 的版本为 2.0。同时,A 依赖 C...

    xiaoxi666
  • Maven 依赖调解源码解析(二):如何调试 Maven 源码和插件源码

    有了源码包和 Demo 项目,我们就能够着手分析了。那么问题来了,我们对 Maven 源码并不熟悉,总不能一头扎进去看。那么,我们就用调试的方式分析吧,简单且精...

    xiaoxi666
  • maven依赖的小坑

    提示Could not find artifact e-iceblue:spire.doc.free:pom:3.9.0 in aliyunmaven (htt...

    阿超
  • Maven中的依赖管理

    鱼找水需要时间
  • maven依赖的版本管理

    在一个项目中,这样做的必要性不大,这种机制一般用于maven项目继承,子项目可以直接使用简化的依赖配置,从而确保和父项目版本一致。

    pollyduan
  • jsoup的maven依赖及jsoup解析html获取Element的数据(demo)

    挑战者
  • Maven依赖冲突的解决方式

    对Maven概念还不了解的可以看看我的这篇文章: https://blog.csdn.net/pjh88/article/details/108520721

    一只胡说八道的猴子
  • Maven依赖冲突的解决方式

    对Maven概念还不了解的可以看看我的这篇文章: https://blog.csdn.net/pjh88/article/details/108520721

    一只胡说八道的猴子
  • Maven的依赖管理的体系设计

    在Maven的生命周期中,存在编译、测试、运行等过程,那么有些依赖只用于测试,比如junit;有些依赖编译用不到,只有运行的时候才能用到,比如mysql的驱动包...

    用户7737280
  • Intellij idea的maven依赖图

    Intellij idea下查看maven的依赖图与eclipse有所不同。下面简单介绍一下Intellij下maven的查看使用。

    程序新视界
  • 基于微服务的父maven依赖

    用户1134788
  • maven 中的版本依赖冲突问题

    在使用maven构建依赖的时候,发现springBoot的版本和导入的依赖版本中的 spring-context 的版本出现冲突。

    猎户星座1
  • maven依赖某工程确定的版本

    maven项目中,可能存在依赖的多个工程中同时依赖某个工程,而该工程被依赖的版本却不一样。比如工程demo依赖工程A,工程B。工程A和工程B依赖的thrift的...

    jiewuyou
  • Maven 项目中依赖的搜索顺序

    网上有很多关于maven项目中mirror、profile、repository的搜索顺序的文章,说法不一。官方文档并没有找到相关的说明,鉴于此,我抽时间做了一...

    pollyduan
  • Maven的SSM依赖导入基本模板

    用户9006224

扫码关注腾讯云开发者

领取腾讯云代金券