共计 1325 个字符,预计需要花费 4 分钟才能阅读完成。
1、何为依赖冲突
Maven 是个很好用的依赖管理工具,但是再好的东西也不是完美的。Maven 的依赖机制会导致 Jar 包的冲突。举个例子,现在你的项目中,使用了两个 Jar 包,分别是 A 和 B。现在 A 需要依赖另一个 Jar 包 C,B 也需要依赖 C。但是 A 依赖的 C 的版本是 1.0,B 依赖的 C 的版本是 2.0。这时候,Maven 会将这 1.0 的 C 和 2.0 的 C 都下载到你的项目中,这样你的项目中就存在了不同版本的 C,这时 Maven 会依据依赖路径最短优先原则,来决定使用哪个版本的 Jar 包,而另一个无用的 Jar 包则未被使用,这就是所谓的依赖冲突。
在大多数时候,依赖冲突可能并不会对系统造成什么异常,因为 Maven 始终选择了一个 Jar 包来使用。但是,不排除在某些特定条件下,会出现类似找不到类的异常,所以,只要存在依赖冲突,在我看来,最好还是解决掉,不要给系统留下隐患。
2、解决方法
解决依赖冲突的方法,就是使用 Maven 提供的 <exclusion> 标签,<exclusion> 标签需要放在 <exclusions> 标签内部,就像下面这样:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
<exclusions>
<exclusion>
<artifactId>log4j-api</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
log4j-core 本身是依赖了 log4j-api 的,但是因为一些其他的模块也依赖了 log4j-api,并且两个 log4j-api 版本不同,所以我们使用 <exclusion> 标签排除掉 log4j-core 所依赖的 log4j-api,这样 Maven 就不会下载 log4j-core 所依赖的 log4j-api 了,也就保证了我们的项目中只有一个版本的 log4j-api。
3、Maven Helper
看到这里,你可能会有一个疑问。如何才能知道自己的项目中哪些依赖的 Jar 包冲突了呢?Maven Helper 这个 InteliJ IDEA 的插件帮我们解决了这个问题。插件的安装方法我就不讲了,既然你都会 Maven 了,我相信你也是会安装插件的。
在插件安装好之后,我们打开 pom.xml 文件,在底部会多出一个 Dependency Analyzer 选项
点开这个选项
找到冲突,点击右键,然后选择 Exclude 即可排除冲突版本的 Jar 包。
4、小技巧
除了使用 Maven Helper 查看依赖冲突,也可以使用 IDEA 提供的方法——Maven 依赖结构图,打开 Maven 窗口,选择 Dependencies,然后点击那个图标(Show Dependencies)或者使用快捷键(Ctrl+Alt+Shift+U),即可打开 Maven 依赖关系结构图
在图中,我们可以看到有一些红色的实线,这些红色实线就是依赖冲突,蓝色实线则是正常的依赖。
若文章有任何问题,欢迎留言指出——作者博客:桔子笔记