文章目录
- 一、依赖冲突概念
- 1、什么是依赖冲突
- 2、依赖冲突的原因
- 3、如何解决依赖冲突
- 二、查看依赖冲突-maven-helper
- 1、安装
- 2、helper使用
- 1、conflicts的阅读顺序(从下向上看)
- 2、dependencies as List的阅读顺序(从下向上看)
- 3、dependencies as Tree阅读(从上向下看)
- 三、解决依赖冲突
- 1、排除指定版本(常用,推荐)
- 1、查看冲突
- 2、排除不需要的版本
- 3、查看pom依赖,刷新pom后
- 4、再次点击【conflicts】,或者点击【Refresh UI】进行刷新
- 2、使用第一声明者优先原则
- 3、锁定版本(推荐)
- 总结
一、依赖冲突概念
1、什么是依赖冲突
依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突,从而导致调试过程中出现类似类找不到,NoSuchMethodError等错误。
2、依赖冲突的原因
依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突
3、如何解决依赖冲突
首先查看产生依赖冲突的类jar,其次找出我们不想要的依赖类jar,手工将其排除在外就可以了。
二、查看依赖冲突-maven-helper
安装了Maven Helper插件,只要打开pom文件,就可以打开该pom文件的Dependency Analyzer视图(在文件打开之后,文件下面会多出这样一个tab),进入Dependency Analyzer视图之后有三个查看选项,分别是Conflicts(冲突)、All Dependencies as List(列表形式查看所有依赖)、All Dependencies as Tree(树结构查看所有依赖)。并且这个页面还支持搜索。很方便!
1、安装
2、helper使用
1、当Maven Helper 插件安装成功后,打开项目中的pom文件,下面就会多出一个图
2、打开pom文件,并可以切换tab,简单使用
- Conflicts(查看冲突)
- All Dependencies as List(列表形式查看所有依赖)
- All Dependencies as Tree(树形式查看所有依赖)
当前界面上还提供搜索功能 方便使用
1、conflicts的阅读顺序(从下向上看)
从图中可以看出有哪些jar存在冲突,存在冲突的情况下最终采用了哪个依赖的版本。标红的就是冲突版本,白色的是当前的解析版本。这个选项,需要从下向上看;
并且这里是:A依赖于B,B依赖于C,C依赖D。
如下图:冲突的jar包就是jackson,swagger通过web、json最终依赖到jackson。
2、dependencies as List的阅读顺序(从下向上看)
dependencies as List 栏目和conflicts一样,都是从下向上看,依次依赖。
3、dependencies as Tree阅读(从上向下看)
datascope依赖securlty,再依赖system,再依赖core,再依赖到jackson
三、解决依赖冲突
1、排除指定版本(常用,推荐)
1、查看冲突
点击【Conflicts】,从图中可以看到那些jar包冲突。存在冲突的情况下最终选择了那么版本。标红的就是冲突版本,白色的是当前的解析版本。
如果有多个依赖的版本发生了冲突,那么只要把其中一个依赖给排除掉,只剩下一个依赖,那么自然就可以解决冲突的问题。我们只需要使用exclusion关键字对相关依赖进行排除就行
- 这里可以看到 spirng-beans-4.2.4.release和spring-beans-5.0.12冲突,这里舍弃spirng-beans-4.2.4.release这个版本,保留spring-beans-5.0.12 这个版本。使用 exclusion 排除定位到的冲突包。
2、排除不需要的版本
通过上边的图,我们一刻看到最终选择了【4.2.4】版本,如果我要使用【5.0.12】版本。那么只需要吧【4.2.4】给排除掉。点击【Exclude】进行排除即可。
3、查看pom依赖,刷新pom后
4、再次点击【conflicts】,或者点击【Refresh UI】进行刷新
2、使用第一声明者优先原则
谁先定义的就用谁的传递依赖,即在pom.xml文件自上而下,先声明的jar坐标,就先引用该jar的传递依赖。因此我们如果要使用5.2.0版本的spring core包,我们可以改成如下声明
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
</dependencies>
3、锁定版本(推荐)
使用dependencyManagement 进行版本锁定,dependencyManagement可以统一管理项目的版本号。这样的话,导入依赖的时候就会直接使用我们锁定的依赖版本。确保应用的各个项目的依赖和版本一致。
(1)在父项目的pom中进行约定
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
这样在后续的子工程中,就不用写版本号了,直接就沿用副项目的版本号
(2):在同一个项目pom中,既约定版本号,又导入依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
总结
综上就是maven如何排查依赖冲突以及解决方法,
- 对于排查依赖个人比较推荐使用maven helper插件,
- 至于解决依赖冲突个人推荐使用版本锁定的方法,此外dependencyManagement只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖