一个线上项目的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配置如何,一定要上线在用。。。

相关推荐
稻草猫.13 分钟前
Java多线程(一)
java·后端·java-ee·idea
躲在云朵里`16 分钟前
Spring Scheduler定时任务实战:从零掌握任务调度
java·数据库·mybatis
Java中文社群29 分钟前
炸裂:SpringAI新版发布,终于支持断线重连了!
java·后端·ai编程
哈喽姥爷1 小时前
Spring Boot--Bean的扫描和注册
java·spring boot·后端·bean的扫描和注册
problc1 小时前
Spring Boot `@Service` 互相调用全攻略:`@Autowired` vs `@Resource`
java·spring boot·后端
码熔burning1 小时前
JVM 对象创建的核心流程!
java·jvm
努力努力再努力wz1 小时前
【C++进阶系列】:万字详解红黑树(附模拟实现的源码)
java·linux·运维·c语言·开发语言·c++
毕设源码纪师姐1 小时前
计算机毕设 java 高校机房综合管控系统 基于 SSM+Vue 的高校机房管理平台 Java+MySQL 的设备与预约全流程系统
java·mysql·课程设计
渣哥2 小时前
HashMap 扩容为啥总是 2 的倍数?一场来自底层的“强迫症”探险
java
叫我阿柒啊2 小时前
从Java全栈到前端框架的实战之路
java·数据库·微服务·typescript·前端框架·vue3·springboot