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

相关推荐
华如锦9 小时前
四:从零搭建一个RAG
java·开发语言·人工智能·python·机器学习·spring cloud·计算机视觉
Tony_yitao9 小时前
22.华为OD机试真题:数组拼接(Java实现,100分通关)
java·算法·华为od·algorithm
JavaGuru_LiuYu9 小时前
Spring Boot 整合 SSE(Server-Sent Events)
java·spring boot·后端·sse
爬山算法10 小时前
Hibernate(26)什么是Hibernate的透明持久化?
java·后端·hibernate
彭于晏Yan10 小时前
Springboot实现数据脱敏
java·spring boot·后端
luming-0210 小时前
java报错解决:sun.net.utils不存
java·经验分享·bug·.net·intellij-idea
北海有初拥10 小时前
Python基础语法万字详解
java·开发语言·python
alonewolf_9910 小时前
Spring IOC容器扩展点全景:深入探索与实践演练
java·后端·spring
super_lzb10 小时前
springboot打war包时将外部配置文件打入到war包内
java·spring boot·后端·maven
毛小茛10 小时前
芋道管理系统学习——项目结构
java·学习