一、maven的依赖优先级原则
首先,复习下maven依赖的优先原则
- 依赖最短路径优先原则
一个项目Demo依赖了两个jar包,其中A-B-C-X(1.0) , A-D-X(2.0)。由于X(2.0)路径最短,所以项目使用的是X(2.0)。 - pom文件中声明顺序优先 如果A-B-X(1.0) ,A-C-X(2.0) 这样的路径长度一样的情况下,maven会根据pom文件声明的顺序加载,如果先声明了B,后声明了C,项目使用的依赖就会是X(1.0)。
- 覆盖优先原则
子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配置如何,一定要上线在用。。。