java maven依赖传递以及版本冲突

news/2025/3/15 9:35:11/

文章目录

  • 基本背景
  • 基本排查冲突工具
  • 依赖传递:很多依赖到底使用哪个版本的依赖
  • dependencyManagement 作用
  • exclusions
  • 其他问题

基本背景

你使用 java,使用 maven pom.xml 管理你的依赖包
可能常常遇到依赖版本冲突,或者很多依赖包,不清楚到底使用哪个依赖的版本

基本排查冲突工具

idea 可以下载 mavenHelper 插件,可以很方便来做依赖冲突的排查

原始的可以使用 mvn 命令

mvn dependency:tree -Dverbose

依赖传递:很多依赖到底使用哪个版本的依赖

比如 A 项目中使用 B 依赖,B 项目中使用了 C 依赖,
再同时 A 项目中使用了 D 依赖,D 项目中使用了 C 依赖,
再同时 A 项目中使用了 E 依赖,E 项目中使用了 F 依赖,F 项目中使用了 C 依赖
再同时 A 项目中使用了 C 依赖

即:

  • A -> B -> C(1.0)
  • A -> D -> C(2.0)
  • A -> E -> F -> C(3.0)
  • A -> C(4.0)

那么 A 项目 run 起来后代码逻辑到底使用哪个版本的 C 依赖在跑呢?

首先得明确,并不是 A 自己的代码逻辑使用 4.0 的 C,然后 A 项目中运行到 B 中的代码时候就按照 1.0 的 C 去跑,并不是这样的,统一在 runing 的 A 项目统一使用一个版本的 C 的依赖在 run

依赖传递规则:

  • 路径浅的优先级高
  • 同层路径的谁先声明谁优先级高

所以按照这样的规则我们知道:
C(4.0) > C(1.0) > C(2.0) > C(3.0)

所以 A 项目将使用 4.0 的 C 在 run

dependencyManagement 作用

同样的例子:

  • A -> B -> C(1.0)
  • A -> D -> C(2.0)
  • A -> E -> F -> C(3.0)
  • A -> C(4.0)

如果你设立了 dependencyManagement 中,指定了 C 的版本是 5.0,当 A 不存在直接声明的依赖 C(4.0) 时,它将统一按照 C(5.0) 的版本去 run,如果 A 直接声明了 C 的版本,则优先级最高的是 A 直接声明的 C 的版本

所以优先级上:
A 直接声明的版本 > dependencyManagement 指定的版本 > 路径更浅的依赖版本 > 同深浅则是率先声明的依赖版本

exclusions

依赖中 exclusions 掉某个子依赖,目的是防止内部依赖往外部传递,比如 A -> B,B 项目中有 C 依赖,如果 A 没有直接的 C 依赖,那么 A 使用的是 B 中的 C 依赖的版本,当 B exclusion 掉了 C,则表示这个 C 依赖无法传递到 A

其他问题

依赖隔离?
如果 A -> B -> C,同时也有 A -> C,我想让 A 在 run 时候,A 使用自己的 C 依赖版本,run 到代码 B 到地方使用 B 内部依赖 C 的版本,这样一般是不可行的,如果非要做则使用 Maven Shade 插件来重定位依赖。这样其实做起来比较麻烦


http://www.ppmy.cn/news/1579277.html

相关文章

实验篇| CentOS 7 下 Keepalived + Nginx 实现双机高可用

为什么要做双机高可用?‌ 想象一下:你的网站突然宕机,用户无法访问,订单流失、口碑暴跌…💸 ‌双机热备‌就是解决这个痛点的终极方案!两台服务器互为备份,724小时无缝切换,保障业务…

ChatboxAI:开启高效智能交互的全能助手

一、项目概况:跨平台AI客户端的革新者 ChatboxAI 是一款集多功能于一体的 跨平台AI客户端应用,支持 Windows、MacOS、Android、iOS、Linux 及网页端,覆盖了主流操作系统和移动设备。其核心定位是为用户提供 灵活的模型选择 与 本地化智能服务,目前已集成包括 OpenAI 的 GP…

建筑管理(2): 施工承包模式,工程监理,质量监督

文章目录 一. 施工承包模式1. 施工总承包模式1.1 施工总承包的特点1.2 施工总承包模式中的承包方 2. 平行承包模式3. 联合体与合作体承包模式 二. 工程监理1. 强制实行监理的工程范围1.1 国家重点建设工程1.2 大中型公用事业工程(重点)1.3 成片开发建设的住宅小区工程1.4 必须实…

深入理解静态与动态代理设计模式:从理论到实践

静态代理设计模式 1.为什么需要代理设计模式? javaEE分层开发中,哪个层次对于我们来讲最重要 DAO---->Service---->Controller JavaEE分层中,最为重要的是Service层 Service层包含了那些代码 Service层核心功能(几十行 上百代码) 额外…

批量清空 Excel 文档主题、标记、作者、保存时间、总编辑时间元数据

在 Excel 文档中,通常会包含一些元数据,这些元数据中有文档的标题、版本号、作者编辑时间等等各种各样的信息,这些信息在某些情况下是非常隐私,也是非常重要的。因此当我们需要将文档发送给第三方的时候,我们通常需要对…

泛目录效果:提升网站SEO与用户体验的关键策略

泛目录效果:提升网站SEO与用户体验的关键策略 在当今数字化时代,网站优化(SEO)已成为企业提升在线可见性和吸引流量的重要手段。其中,泛目录效果作为一种有效的SEO策略,不仅能够提升搜索引擎排名&#xff…

珠算之加减法中出现负数情况

在珠算加减法过程中出现负数情况的处理 如果数字 A 小于 B,要求计算 A-B,此时出现了小数减大数的情况,其结果应该是负数。 在平时,计算 A-B 时,如果发现 A 小于 B,则计算时只要计算 B-A,结果记…

3.14学习总结 排序算法

插入排序&#xff1a; 1.直接插入排序 维护一个有序区&#xff0c;把元素一个个插入有序区的适当位置&#xff0c;直到所有元素都有序为止。 for (int i 0;i < n - 1;i) {//升序int end i;int temp k[end 1];while (end > 0) {if (temp < k[end]) {k[end 1] …