一个线上项目的Maven依赖优先级排查

一、maven的依赖优先级原则

首先,复习下maven依赖的优先原则

  1. 依赖最短路径优先原则
    一个项目Demo依赖了两个jar包,其中A-B-C-X(1.0) , A-D-X(2.0)。由于X(2.0)路径最短,所以项目使用的是X(2.0)。
  2. pom文件中声明顺序优先 如果A-B-X(1.0) ,A-C-X(2.0) 这样的路径长度一样的情况下,maven会根据pom文件声明的顺序加载,如果先声明了B,后声明了C,项目使用的依赖就会是X(1.0)。
  3. 覆盖优先原则
    子pom内声明的优先于父pom中的依赖。

二、问题

这个项目中pom文件的依赖配置如下:
引入 umepsr-domain 为2.4.8-SNAPSHOT版本

引入 umepsr-service 为2.3.4-SNAPSHOT版本

其中umepsr-service内部依赖的umepsr-domain也为2.4.8-SNAPSHOT。
umepsr-domain 为2.4.8-SNAPSHOT

问题出现了,我在本项目中依赖的umepsr-service中的依赖umepsr-domain为其他版本。如图

点进项目依赖的umepsr-service,版本确实为2.3.4-SNAPSHOT版本
但是在这里点进 EmdInfoBean ,如图 umepsr-domain 版本就变为了2.4.5

按照优先级规则,根据以上第二张图的配置文件,他就不应该出现这种情况。

二、排查原因

1. 第一次定位

此项目父pom中umepsr-domain版本为2.4.5

改后重试

umepsr-domain版本确实变了,但是变为了2.2.0。

这里的依赖关系如下 本项目依赖于umepsr-service(2.3.4-SNAPSHOT),同时umepsr-service依赖于umepsr-domain (2.4.8-SNAPSHOT) 本项目的父pom中依赖于umepsr-domain (2.4.5)

说实话,这个时候我有点懵逼,就当父pom中的依赖优先级高于二级依赖吧。但是2.2.0这个版本确实让我猝不及防。没办法继续定位问题吧。

2. 第二次定位

此时根据第一次定位的经验,我观察到umepsr-service的父pom中umepsr-domain版本为2.2.2。

说实话版本号都不对,就不要在没有希望的事上浪费时间(虽然我浪费了)

3. 第三次定位

此项目父pom中umepsr-service版本为2.2.2
其实我一开始是忽略了这里,因为我们已经在本项目的pom中看到了,umepsr-service 版本为2.3.4-SNAPSHOT,这个优先级是最高的。

但是我走投无路了啊,哪里都要瞅一瞅。于是我就找到了umepsr-domain 2.2.0 版本的由来。
改后:

改后重试
umepsr-service还是2.3.4-SNAPSHOT,umepsr-domain还是2.2.0。也就是说仍然没有解决问题,心态开始崩溃。。。

4.第四次定位

我尝试在左边那个dependency把umepsr-service 2.2.0版本给强制删了,当时点进去依赖版本确实没问题,我以为我的强制删除重置了优先级规则,后来发现加载后还是原来的样子。

经过高人指点迷津,因为umepsr-service是在本地调用的接口服务,这个接口会转到测试环境。所以需要将umepsr-service上线到测试环境才能使用改后的逻辑。

也就是说,我在私服上打的包虽然是正常版本的,但是,服务会调用接口服务,服务中的最新依赖配置没有上线,所以才出现了这样的问题。

上线后,测试成功。

总结:线上的项目,接口类型的依赖,不用管本地的依赖版本和私服中的pom配置如何,一定要上线在用。。。

相关推荐
晒太羊的猫7 分钟前
hot100子串
java·算法·leetcode
开开心心就好31 分钟前
本地文件搜索工具,双击Ctrl就能呼出搜索
java·服务器·前端·支持向量机·ffmpeg·音视频·模拟退火算法
独隅35 分钟前
Claude 高效使用指南深度评测
java·开发语言·claude·claude code
ByteCoder.43 分钟前
班前十分钟的清单,按体检引导单来写
java·服务器·前端·助播虾
海的透彻1 小时前
如何让docker容器启动时用自定义的用户
java·docker·dubbo
疯狂学习GIS1 小时前
将谷歌地球引擎账号升级为Contributor与Partner层级的方法
java·数据库·人工智能
GG.WinGel1 小时前
质数数目(蓝桥杯练习题)
java·数据结构·算法·青少年编程·蓝桥杯
泡泡糖的中文规格书1 小时前
HDLbits 2.2 学习笔记 · 多路复用器
java·开发语言
John_Hui1 小时前
第 3 篇:配置 JDK 17 环境
java·开发语言·ubuntu
秋天的怀念_David1 小时前
算法一千零一夜 · 第十七夜 长街点灯
java·程序人生·算法