解决maven工程jar包冲突问题

在开发中maven对我们统一管理jar有很大的帮助,但是如果我们管理的不当,就有可能会造成jar包的冲突,所以我们要解决这个问题。首先我们来了解为什么为造成jar包的冲突。

一、maven产生jar冲突的原因

首先要了解jar包依赖的传递性,依赖传递

1、依赖传递

就是在项目中,依赖某个jar包,而这个jar包又依赖另一个jar包,这时候maven就会把这个jar也引入到项目中来。
举个例子:我需要引入spring-contextjar包,而spring-context又依赖于spring-core核心包,此时maven在解析pom.xml文件的时候,就会把spring-core包也引进来。
解决maven工程jar包冲突问题
可以看到,虽然只导入spring-context的坐标,但是相关spring核心包已经导入到项目中来了。现在可以说说为什么jar会冲突了。

2、jar包冲突

那么是怎么产生jar包冲的?比如现在项目需要依赖两个jar包分别是a和b,而a和b又同时依赖于c。那么,我在项目中引入a包和b包,根据依赖传递的原则,c包会引入两个。此时,如果这两个jar包又不是一个版本(比如a依赖c.1.0而b依赖c.2.0),那么就产生jar冲突了。

二、解决jar包冲突

方式1:最先申明优先原则:就是哪个jar包的坐标在靠上的位置,就是先申明的,那么就会先引入这个jar包下的依赖包

例:spring-context包和spring-beans都依赖于spring-core包,在项目中同时引人这两个jar包。
解决maven工程jar包冲突问题
会看到此时项目中引入的spring-core包是5.05:
解决maven工程jar包冲突问题
如果把spring-beans包放入到spring-context坐标前,那么项目中的引入的就是此时spring-contextjar包依赖的对应版本的spring-core包
解决maven工程jar包冲突问题

方式2:最短路径优先原则:就是谁的路劲短,就优先引入

例:直接引入spring-core比通过引入spring-context包依赖传递的方式引入spring-core的路径短,那么maven就会根据直接引入spring-core对应的版本
解决maven工程jar包冲突问题
可以看到:
解决maven工程jar包冲突问题

方式3:手动排除jar包依赖

在pom.xml文件中使用 < exclude>标签排除重复的jar包
解决maven工程jar包冲突问题
此时,即使spring-beans坐标在前,但是maven也会引入spring-context包依赖下的spring-core包:
解决maven工程jar包冲突问题
上面只是最基本的方法,可能实际开发中jar包的依赖关系复杂的多,所以遇到具体的jar包冲突时具体去解决。