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

相关推荐
华仔啊39 分钟前
3行注解干掉30行日志代码!Spring AOP实战全程复盘
java·spring boot·后端
Fireworkitte43 分钟前
Tomcat 的核心脚本catalina.sh 和 startup.sh的关系
java·tomcat
风吹落叶32571 小时前
深入解析JVM内存管理与垃圾回收机制
java·开发语言·jvm
叶~璃1 小时前
人工智能驱动的开发变革
java
悟能不能悟1 小时前
排查Redis数据倾斜引发的性能瓶颈
java·数据库·redis
Derek_Smart2 小时前
Java线程死亡螺旋:解析与预防策略
java·spring·性能优化
翁正存2 小时前
IDEA测试代码报java file outset source root异常
java·ide·intellij-idea
励志五个月成为嵌入式糕手2 小时前
0819 使用IP多路复用实现TCP并发服务器
java·服务器·tcp/ip
Mi_Manchikkk2 小时前
Java高级面试实战:Spring Boot微服务与Redis缓存整合案例解析
java·spring boot·redis·缓存·微服务·面试
呼啦啦啦啦啦啦啦啦10 小时前
常见的排序算法
java·算法·排序算法