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

相关推荐
头发还在的女程序员8 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats8 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123459 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥11 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.11 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔13 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊13 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
景同学14 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端
C++、Java和Python的菜鸟15 小时前
第7章 后端Web实战(Tlias系统)
java
憧憬成为java架构高手的小白15 小时前
黑马八股--spring框架学习
java·学习·spring