分享一次Maven钻石依赖的解决思路
前言:
项目管理上有一个著名的概念叫着「钻石依赖」,是指软件依赖导致同一个软件包的两个版本需要共存而不能冲突。
我们平时使用的 maven 是这样解决钻石依赖的,它会从多个冲突的版本中选择一个来使用,如果不同的版本之间兼容性很糟糕,那么程序将无法正常编译运行。Maven 这种形式叫「扁平化」依赖管理。
我以我的这个项目为例,可以发现一个Spring的默认的BeanFacotry的接口,重复实现了呢4遍(实际上4个都是同样的,因为多引用了3个maven工具包导致Springboot 包被重复引用了)。这时候就要排查引入的Maven包的问题,因为这个3个工具包也是我自己实现的,然后推送到了Maven中央仓库就可以自己在项目中引入使用了。
1.看问题
现在来看问题

看一下Maven包里的引用操作

进来发现!我去,这还得了?我只引用你这个工具,结果你自己给我引入一堆spring-boot的包,并且还给我制定了版本!那我要是用的Spring-boot 3这不炸了?赶紧解决
(我开源的扳手工具地址:https://github.com/nb-sb/whn-wrench)

2.解决方案
a.自己在项目中排除依赖

b.修改扳手项目中的依赖scope类型
(因为这扳手项目也是我自己实现的,所以为了通用型肯定直接修改扳手项目是最好的,但是如果你引入的项目是其他人的包,他的包引入的依赖和你的依赖冲突的,就要使用a办法,排除依赖,这里就不过多阐述了,网上很多教程)
首先先修改scope范围,改为provided

可以看一下scope可以填写哪些参数(这里不过多阐述,这篇主要来解决钻石依赖问题的)

| 作用域 | 编译classpath | 运行classpath | 测试classpath | 打包到产品 |
|---|---|---|---|---|
| compile | ✅ | ✅ | ✅ | ✅ |
| provided | ✅ | ❌ | ✅ | ❌ |
| runtime | ❌ | ✅ | ✅ | ✅ |
| test | ❌ | ❌ | ✅ | ❌ |
| system | ✅ | ✅ | ✅ | ✅ |
然而看后果结果还是没有完全排除,还是可以引入进来?什么鬼?继续排查

经过不懈查找,破案了,原来是这个组件引入了Redission,Redission又依赖了spring-context-support,导致的重复引用。由于引用的版本和我项目版本一样所以没有异常,如果引入的版本和我项目的版本不一致,包不全会有依赖冲突问题


OK,发现问题就好解决了,直接排除这个redission中的spring的冲突的依赖

查看
perfect !!!没有重复引入的问题了

结尾:提交代码到dev分支。。在合并到main分支 ->推送到Maven中央仓库

总结:
遇到钻石依赖一般可以直接排除,但是这里由于依赖的包是我自己写的,所以直接可以修改原包即可,大家如果遇到钻石依赖问题可以按照我这个思路排查
1.查看依赖所在的pom文件
2.分析版本问题所在的包中
3.常见解决思路:
排除依赖、版本锁定原则(定义指定版本)、父子模块覆盖原则(父模块里声明的依赖,子模块里重复声明。子模块内会覆盖父模块的依赖)
版权属于:戏人看戏博客网
本文链接:https://blog.web3er.cn/archives/1978.html
若无注明均为戏人看戏原创,转载请注明出处,感谢您的支持!