[原]Maven依赖冲突的解决

祝一迪 18/10/25 20:51:53

在使用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啦。

作者:dela_ 发表于 2018/10/25 20:51:53 原文链接 https://blog.csdn.net/dela_/article/details/83386258
阅读:35