Maven 是当前最普及的包管理工具,在我们的项目变大后会时不时的遇到需要解决依赖冲突的场景。这里介绍一种通过Maven中的插件,基于命令行实现依赖树查看的方法。


基本命令如下:

mvn dependency:tree

在项目工程中使用该命令可以查看当前工程依赖包所产生的依赖树。
在这里插入图片描述
当然,在我们使用多模块编程时,会遇到由于找不到对应的依赖包而报错。这时你需检查报错的依赖包是否是你当前工程中的子模块,如果是这样的话则需要先将工程打包到本地Maven仓库后再执行依赖树查看命令:

mvn clean install dependency:tree

当我们想要查看当前依赖树的冲突情况时,则需要添加选项 -Dverbose 则可以看到依赖冲突的详细情况。

mvn dependency:tree -Dverbose

在这里插入图片描述

处理 Maven 依赖冲突

如果发生依赖冲突,首先,对于多个jar包都引用同一jar包的情况。
在这里插入图片描述
最好是在程序中显式定义被共同引用的jar包的依赖,来统一版本号,方便维护。
在这里插入图片描述
如果模块A模块B都统一依赖包C,可能会出现两种情况

  1. AB 引用的 C 版本相同
    这时按照pom.xml定义顺序选择第一个即可,没有冲突问题,如果在项目的 Maven 中显示定义了C 依赖,那么用选择项目定义的依赖,反正版本都一样,没有影响。
    在这里插入图片描述
  2. AB依赖的C版本不同,选择版本高的那个,这时会出现两种结果

在这里插入图片描述
2.1 高版本兼容低版本,所以不会出现问题
2.2 高版本不兼容低版本

假如A依赖C2版本,B依赖C3版本,C3不兼容C2,Maven选择了高版本C3,对A来说会出现问题

解决方法

  1. 提升A版本,找到依赖C3A版本
  2. 如果B版本也可依赖C2,在项目的Maven中显示定义对C2的依赖,这样所有都使用C2版本
  3. 如果B版本不支持C2版本,只能降低B版本,找到依赖C2B版本

从功能性和可维护性考虑,优先使用高版本的依赖,因为理论上来说高版本的依赖会有更少的 bug和更好的性能。只有极少数情况下需要考虑低版本的兼容问题,但是这样会产生技术债务,建议作为应急方案使用,并尽早升级高版本的依赖。

参考资料

Resolving conflictss using the dependency tree
maven 依赖jar包时版本冲突的解决

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐