Maven 是当前最普及的包管理工具,在我们的项目变大后会时不时的遇到需要解决依赖冲突的场景。这里介绍一种通过Maven中的插件,基于命令行实现依赖树查看的方法。
基本命令如下:
mvn dependency:tree
在项目工程中使用该命令可以查看当前工程依赖包所产生的依赖树。
当然,在我们使用多模块编程时,会遇到由于找不到对应的依赖包而报错。这时你需检查报错的依赖包是否是你当前工程中的子模块,如果是这样的话则需要先将工程打包到本地Maven仓库后再执行依赖树查看命令:
mvn clean install dependency:tree
当我们想要查看当前依赖树的冲突情况时,则需要添加选项 -Dverbose
则可以看到依赖冲突的详细情况。
mvn dependency:tree -Dverbose
处理 Maven 依赖冲突
如果发生依赖冲突,首先,对于多个jar包都引用同一jar包的情况。
最好是在程序中显式定义被共同引用的jar包的依赖,来统一版本号,方便维护。
如果模块A
和模块B
都统一依赖包C
,可能会出现两种情况
A
和B
引用的C
版本相同
这时按照pom.xml
定义顺序选择第一个即可,没有冲突问题,如果在项目的 Maven 中显示定义了C
依赖,那么用选择项目定义的依赖,反正版本都一样,没有影响。
A
和B
依赖的C
版本不同,选择版本高的那个,这时会出现两种结果
2.1 高版本兼容低版本,所以不会出现问题
2.2 高版本不兼容低版本
假如
A
依赖C2
版本,B
依赖C3
版本,C3
不兼容C2
,Maven
选择了高版本C3
,对A
来说会出现问题
解决方法
- 提升
A
版本,找到依赖C3
的A
版本 - 如果
B
版本也可依赖C2
,在项目的Maven
中显示定义对C2
的依赖,这样所有都使用C2
版本 - 如果
B
版本不支持C2
版本,只能降低B
版本,找到依赖C2
的B
版本
从功能性和可维护性考虑,优先使用高版本的依赖,因为理论上来说高版本的依赖会有更少的 bug和更好的性能。只有极少数情况下需要考虑低版本的兼容问题,但是这样会产生技术债务,建议作为应急方案使用,并尽早升级高版本的依赖。
参考资料
Resolving conflictss using the dependency tree
maven 依赖jar包时版本冲突的解决