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包时版本冲突的解决

Maven命令行查看依赖树相关推荐

  1. maven命令行下载依赖

    maven项目中依赖错误,使用maven reimport 不能解决,试试maven命令行下载依赖 mvn dependency:get -DremoteRepositories=http://mav ...

  2. Maven命令行参数

    Maven命令行参数 参考: https://books.sonatype.com/mvnref-book/reference/running-sect-options.html 查看mvn命令opt ...

  3. Winrar从命令行查看压缩文件内容

    如果能从命令行查看压缩文件内容,可以避免有时候的弹窗: 看了一下,说是v参数是查看: 找不到路径:先加一下path环境变量: 输个命令:错了: 用 -v,但是没有在命令行显示:而是弹出了Winrar的 ...

  4. 了解活动目录操作主机角色及GUI命令行查看方法

    操作主机又称为:Flexible Single Master Operations (FSMO) Schema master (架构主控):负责整个林的"类","属性&q ...

  5. 命令行查看网卡使用的驱动+跳板机命令行设置静态地址

    命令行查看网卡使用的驱动 lspci -vvv 如果设备信息的没有出现下面两行 Kernel driver in use: nvme     Kernel modules: nvme 说明驱动没安装 ...

  6. CMD 命令行查看端口被哪个程序占用,并根据PID值,找到相应的程序,关闭掉对应服务或进程!...

    CMD 命令行查看端口被哪个程序占用,并根据PID值,找到相应的程序,关闭掉对应服务或进程! 不用任何第三方软件的情况下,打开CMD执行如下命令:1,netstat -ano 你可以查看到Local ...

  7. Android4.4电池电量命令行查看

    命令行查看电池电量方法: #cd /sys/class/power_supply/BATTERY #ls capacity 表示当前电量 status 电池状态 Charging ---> 充电 ...

  8. linux查看docker是否启动命令行,如何通过命令行查看docker服务是否已启动

    通过命令行查看docker服务是否已启动的方法如下: 查看docker的运行状态systemctl status docker 输出如下:[root@izr86o15kikb3az /]# syste ...

  9. Android用命令行查看手机架构

    用命令行查看安卓手机的架构: adb shell cat /proc/cpuinfo 结果实例: processor : 0 BogoMIPS : 3.84 Features : fp asimd e ...

最新文章

  1. Linux中sort、uniq、cut、wc命令详解
  2. 几种流行的AJAX框架:jQuery,Mootools,Dojo,Ext JS的对比
  3. 《Effective.Enterprise.Java中文版》知识点摘要
  4. .NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记...
  5. 9008线刷_小米红米手机新机9008模式怎么进入?小米线刷救砖模式
  6. Tesseract Ocr文字识别
  7. SELinux导致PHP连接MySQL异常Can't connect to MySQL server的解决方法
  8. 《Dotnet9》系列-Google ProtoBuf在C#中的简单应用
  9. 安卓移动应用开发实例_移动应用开发协会纳新 ||掌握信息,赢得未来
  10. java easyui分页源码_SpringMVC+easyUI中datagrid分页实现_2014.5.1
  11. MYSQL的主从和主主复制模式
  12. 数组中常用几种的Arrays方法
  13. php超小免杀大马_PHP免杀大马的奇淫技巧
  14. Android 访问 https的webservice接口
  15. 金融信息安全实训 课堂笔记5
  16. 单片机控制电路的多图纸原理图和层次式设计
  17. Quick bi是什么?
  18. System32和SysWoW64的区别(转载)
  19. 苹果:我们要建设美国新农村
  20. SVN安全证书问题解决方案

热门文章

  1. neovim图标显示乱码,utf8字体显示乱码(Windows10和Centos安装nerd-fonts)
  2. mysql的时区设置
  3. Python中partial的使用
  4. partition by用法
  5. 基于一阶中心差商公式计算出生人口增长率
  6. 施普林格(Springer)免费书籍
  7. x86汇编_指令集大全_笔记_6
  8. 如何解决数组下标越界异常
  9. JavaScript富应用MVC MVVM框架
  10. html列表太多转为下滑菜单,利用CSS过渡属性Transition制作缓缓弹出的纯CSS下拉菜单...