在使用IDEA开发比较大的Spring web项目的时候,常常会在pom文件中导入大量依赖,所以就有可能造成Maven的依赖冲突。下面来看一下如何解决Maven的依赖冲突。
1. 先清当前的jar包的缓存:
IDEA的 File选项 -> invalidate caches/restart
2. 打印Maven的依赖树:
mvn dependency:tree
(建议将内容重定向到一个file里,方便查看,如:mvn dependency:tree > file.txt)
Maven的依赖树的样式如下,图中圈出了一个包与其下所有子包的层级关系:
3. 定位产生依赖冲突的子包:
比如新加了xxx包之后,产生了依赖冲突,那么在file.txt依次全文搜索xxx包下依赖的所有子包,看看是否由别的包也依赖此子包。
如果在别的包(比如yyy包和zzz包)下面也发现有该子包,那么说明需要在xxx包、yyy包、zzz包其中两个包下排除这个子包的依赖,只保留一个包下的该子包的依赖。
那么,具体应该保留哪个包下的子包呢,这是由这几个包下的所依赖的该子包的版本号决定的。我们一般会选择保留版本比较高的子包。
比如xxx包下该子包的版本是1.0.0,yyy包下该子包的版本是1.0.1,zzz包下该子包的版本是1.0.2,那么说明需要保留该子包的是zzz包,需要将xxx包和yyy包下的子包依赖排除。
排除依赖所用的标签是:
在pom文件下找到xxx包和yyy包的依赖,在标签里加上冲突的子包,如下:
<dependency>
<groupId>xxx包的groupId</groupId>
<artifactId>xxx包的artifactId</artifactId>
<version>xxx包的版本号</version>
<exclusions>
<exclusion>
<groupId>冲突的子包的groupId</groupId>
<artifactId>冲突的子包的artifactId</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>yyy包的groupId</groupId>
<artifactId>yyy包的artifactId</artifactId>
<version>yyy包的版本号</version>
<exclusions>
<exclusion>
<groupId>冲突的子包的groupId</groupId>
<artifactId>冲突的子包的artifactId</artifactId>
</exclusion>
</exclusions>
</dependency>
需要注意的是依赖传递问题。也就是说,加入的xxx包下的子包的子包也可能存在依赖冲突,即要将xxx包下每一个层级的包都检测一遍是否存在依赖冲突,以免漏掉依赖传递问题。
4. 解决完之后重新打包:
mvn clean install,再部署就OK啦。