前言:
项目管理上有一个著名的概念叫着「钻石依赖」,是指软件依赖导致同一个软件包的两个版本需要共存而不能冲突。
2025-09-25T06:07:09.png
我们平时使用的 maven 是这样解决钻石依赖的,它会从多个冲突的版本中选择一个来使用,如果不同的版本之间兼容性很糟糕,那么程序将无法正常编译运行。Maven 这种形式叫「扁平化」依赖管理。

我以我的这个项目为例,可以发现一个Spring的默认的BeanFacotry的接口,重复实现了呢4遍(实际上4个都是同样的,因为多引用了3个maven工具包导致Springboot 包被重复引用了)。这时候就要排查引入的Maven包的问题,因为这个3个工具包也是我自己实现的,然后推送到了Maven中央仓库就可以自己在项目中引入使用了。

1.看问题

现在来看问题

2025-09-25T06:09:33.png

看一下Maven包里的引用操作

2025-09-25T06:09:39.png
进来发现!我去,这还得了?我只引用你这个工具,结果你自己给我引入一堆spring-boot的包,并且还给我制定了版本!那我要是用的Spring-boot 3这不炸了?赶紧解决

(我开源的扳手工具地址:https://github.com/nb-sb/whn-wrench)

2025-09-25T06:09:49.png

2.解决方案

a.自己在项目中排除依赖

2025-09-25T06:09:57.png

b.修改扳手项目中的依赖scope类型

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

首先先修改scope范围,改为provided

2025-09-25T06:10:03.png

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

2025-09-25T06:10:08.png

作用域编译classpath运行classpath测试classpath打包到产品
compile
provided
runtime
test
system

然而看后果结果还是没有完全排除,还是可以引入进来?什么鬼?继续排查

2025-09-25T06:10:15.png

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

2025-09-25T06:10:21.png

2025-09-25T06:10:28.png

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

2025-09-25T06:10:49.png

查看

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

2025-09-25T06:10:57.png

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

2025-09-25T06:11:05.png

总结:

遇到钻石依赖一般可以直接排除,但是这里由于依赖的包是我自己写的,所以直接可以修改原包即可,大家如果遇到钻石依赖问题可以按照我这个思路排查

1.查看依赖所在的pom文件

2.分析版本问题所在的包中

3.常见解决思路:

排除依赖、版本锁定原则(定义指定版本)、父子模块覆盖原则(父模块里声明的依赖,子模块里重复声明。子模块内会覆盖父模块的依赖)