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>标签内部,就像下面这样:
1
2
3
4
5
6
7
8
9
10
11
|
<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依赖关系结构图
在图中,我们可以看到有一些红色的实线,这些红色实线就是依赖冲突,蓝色实线则是正常的依赖。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000017542396