Maven依赖冲突详解
Maven依赖冲突详解
前言
最近在项目的使用maven过程中,出现了maven依赖包冲突的问题。后续解决了。记下相关的知识点和资料。希望对你有作用。
一、maven依赖处理
1 对依赖的工作模式
当我们引入一个依赖时,maven会导入对应的包,并且该依赖所依赖的所有包都会进行导入,知道没有依赖为止。
2 包冲突
什么是冲突。它的意思就是在用一个项目导入不同版本的相同名的多个包,那么就产生的冲突。而这个冲突就很有可能导致项目无法运行。举个例子A->B->C1.0,D->E->C2.0,当你的项目引入A和D依赖的时候,就会出现C1.0和C2.0不同版本依赖包的冲突。
3 处理策略
我们在引入两个相同的包时,maven会有一套处理规则,也就是依赖规则,因为maven对于两个或以上相同的依赖,只会选取一个,避免两个依赖对项目产生不稳定性。下面对这个规则进行说明。
这里说的相同依赖,指的是相同包名但可以版本不同
最短路径优先
上面的A->B->C1.0,D->E->C2.0例子,maven会选取路径最短的作为引入。就是C2.0
第一级最后声明优先
第一级指的是我们pom.xml中声明的依赖。如果在这个文件声明两个相同名,但不同版本的依赖,maven会使用最后声明的那个依赖。
其他级别最先声明优先
非第一级,当路径长度一致的时候就会选取最先声明的那个包。
4 包冲突产生的问题
不同版本依赖发生冲突时,由于maven会选取某一个版本依赖,那么在项目中由于某一个包的使用就可能出现依赖包版本变化出现错误。
常见的冲突问题显示的异常:
- java.lang.NoSuchMethodError
- ava.lang.ClassNotFoundException
- java.lang.NoClassDefFoundError
但我们编译通过但确运行报这些异常就要考虑依赖冲突。
二、解决依赖冲突
1 排查冲突包
maven命令
我们可以在项目路径下使用maven命令查看依赖关系
mvn -U dependency:tree -Dverbose
完整的依赖关系图,且会告诉你哪个包产生了冲突mvn -U dependency:tree
项目中实际的依赖关系图。
IDEA
在idea中提供可视化查看依赖的方式
2 解决方法
1.exclusion
去除依赖中的冲突依赖,使用exclusion,比如
<dependency><groupId>group-a</groupId><artifactId>artifact-a</artifactId><version>1.0</version><exclusions><exclusion><groupId>group-c</groupId><artifactId>excluded-artifact</artifactId></exclusion></exclusions></dependency>
2.根据maven依赖规则解决
我们可以利用maven对依赖几个规则去解决冲突。比如出现了冲突,但冲突包的路径不是一级,根据最短路径,在pom文件重新声明一个包指定版本
<groupId>group-c</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2</version>
3.依赖管理
使用父亲模块来管理子模块共同依赖的 jar 包版本,统一版本号
三、工具推荐
Idea插件maven helper
https://blog.csdn.net/GyaoG/article/details/120599475
参考或相关文章
- https://www.cnblogs.com/aspirant/p/8532962.html
- https://blog.csdn.net/UCLoveLikeTheWind/article/details/107986069
- https://blog.csdn.net/justry_deng/article/details/98665086
Maven依赖冲突详解相关推荐
- Maven 依赖冲突踩坑后,将依赖调解、类加载彻底整明白了
作者 | 草捏子 来源 | 草捏子(ID:chaycao) 头图 | CSDN 下载自东方IC 今年年初的时候,阅读过<Maven实战>,当时有了解到Maven可以依赖调解,即当包版本不 ...
- 发布个人项目jar包到maven中央仓库详解
发布个人项目jar包到maven中央仓库详解 1.在sonatype提交发布工单(Issue) sonatype是由社区支持的开源项目托管服务(Open Source Project Reposito ...
- Eclipse中Maven常用命令以及Maven生命周期详解
Eclipse中maven常用的命令 在某一个maven项目右键快捷方式,然后点击Run As就可以发现几个Maven的命令: Maven Build: 这个命令用于编译Maven工程,执行命令后会在 ...
- 一次Maven依赖冲突采坑,把依赖调解、类加载彻底整明白了
今年年初的时候,阅读过<Maven实战>,当时有了解到Maven可以依赖调解,即当包版本不一致时,会根据一定规则选择相应的包来加载,从而避免冲突.当时不解的是既然Maven都能解决冲突,为 ...
- maven依赖冲突解决_Maven依赖树–解决冲突
maven依赖冲突解决 Maven Dependency Tree is very helpful in understanding the project dependencies and reso ...
- 什么是Maven依赖冲突,如何解决Maven依赖冲突
在解决冲突之前首先我们要知道什么是依赖冲突,这样可以更好的去锁定bug原因.下面通过一个代码示例来真正展示出依赖冲突. 目录 依赖冲突代码演示 1.添加依赖 2.观察依赖的层次结构 3.运行项目jra ...
- Maven依赖原则及如何解决Maven依赖冲突
前言 在大数据应用中,现在发现依赖关系非常复杂,在上线之前很长测试,前一段时间在部署udf 出现了导致生产Hiveserver2 宕机问题,出现严重事故.现在就咨询研究一下.Maven虽然已经诞生多年 ...
- Spring三级缓存解决循环依赖问题详解
spring三级缓存解决循环依赖问题详解 前言 这段时间阅读了spring IOC部分的源码.在学习过程中,自己有遇到过很多很问题,在上网查阅资料的时候,发现很难找到一份比较全面的解答.现在自己刚学习 ...
- Maven 依赖冲突那些事
详细带你了解 Maven 依赖冲突的问题原因,以及解决办法.并教你生产碰到这类的问题实战技巧. 0x00. 前言 依赖冲突是日常开发中经常碰到的过程,如果运气好,并不会有什么问题.偏偏小黑哥有点背,碰 ...
- IntelliJ IDEA for Mac中的Maven操作窗口详解
文章目录 简介 操作按钮详解 Reload All Maven Projects Generate Sources and Update Folders For All Projects Downlo ...
最新文章
- 图解MySQL数据库的安排和把持-1
- python 加载与解析xml
- 独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless
- 阿里DataV可视化大屏基本操作
- redis复制原理和应用
- 硬件基础知识--(10)三极管的工作原理
- 小菜鸟装VM之后装linux
- .net上传大文件不成功
- 强悍的 Ubuntu —— 强悍的任意进制转换命令行工具 bc
- java类静态初始化_Java静态代码块和类初始化、实例初始化过程
- 一步一步asp.net_三层构架总结
- china area part 1
- 下载LineageOS 源码编译
- 打印机上的一款驱动-惠普LaserJet1020Plus打印机驱动提供下载
- PCB正片和负片的区别与使用
- 在我的订单中,点击去付款查看每个订单详情
- L1-051 打折(Java)团体程序设计天梯赛
- [搜索引擎]Sphinx的介绍和原理探索
- azul zing_Azul垃圾收集器
- 题目:分别统计字符串中大写字母和小写字母的个数。
热门文章
- Autolisp:利用AuoCAD之Lisp编程案例之智能加工齿轮的演示程序
- oracle的alter table,Oracle ALTER TABLE语句
- 空降Leader,如何开展工作
- centos yum 国内源
- python爬虫获取城市天气信息
- cyj等于什么英语单词_英语参考单词读写规律大全.doc
- 初创公司怎么设置股权结构?
- 互联网晚报 | 9月16日星期五 | ​B站回应诉争“哔哩哔哩”商标被驳回;​苹果占国内高端机70%份额;​蔚来手机被曝明年发布...
- 操作系统的目标与作用
- 百度、腾讯和阿里内部的级别和薪资待遇是什么样的?