- 一.前言:
- 二.前置知识:
- 三.jar包版本管理方式
- 四.解决依赖冲突
在我们开发过程中,尤其对于Java程序员,随着插件,中间件使用越来越多,Maven依赖冲突变成了一个日益严重的问题,有时还真的令人头大,因为版本不对,冲突这些问题还会导致项目直接起不起来,Emmm,那为了规避这些问题,下面提供了比较好的管理jar版本的方式和jar包冲突的解决方法.
maven官方文档:官网地址
二.前置知识:1.传递性:
A依赖B,B依赖C.A能使用C中的类或代码吗?
可以,但是只能使用依赖范围是compile的.也就是说非compile范围的依赖不能传递.
2.依赖原则:
a.路径最短者优先.(–>代表依赖)
举例:A–>B–>C
B–>x.jar(1.0版本)
C–>x.jar(1.1版本)
则最后A中编译的使用的是B中的1.0版本.
b.相同路径先声明者优先.
举例:A–>B A–>C
B–>x.jar(1.0版本)
C–>x.jar(1.1版本)
此时两个依赖路径是相同的,谁先声明(代码放在前面),A就使用谁.
3.maven中的依赖标签
-
dependencyManagement
dependencyManagement中定义的只是依赖的声明,并不实现引入,因此一般只用于依赖管理. -
type
依赖的类型,一般就是依赖的文件类型,默认是jar,还有比如说这些值
jar, war, ejb-client and test-jar
在依赖管理中通常会用到pom,其实就相当于引入了一个pom文件 我们引入了这个pom,其实就相当于在项目中导入了这个pom中的所有依赖 -
scope
依赖的范围, 可以限制依赖的传递性和依赖什么时候会被使用,通常有以下几个值.
这里需要注意这样一个值import,import仅仅支持用于节点中依赖类型是pom的依赖,并且该依赖项会被引入中的pom所代替,因此不存在依赖传递.
假如我们不用import,那么被引入的pom中的所有依赖都将具有传递性.即使子模块没有声明也会被引用.官网说明如下:
1.自己建立父工程.
这是最常见也是最实用的管理版本方式,比如当我们服务拆分成几个单独模块变成微服务时,建立父工程去管理pom就最合适了
注意父工程中仅仅只有一个pom.
样例:
父工程pom
4.0.0 com.wind.springcloud cloud2020 1.0-SNAPSHOT Cloud-provider-payment8001 cloud-consumer-order80 cloud-api-commons cloud-euraka-server7001 Cloud-provider-payment8004 cloud-consumerzk-order80 cloud-consumer-feign-order80 cloud-provider-hystrix-payment8001 cloud-consumer-feign-hystrix-order80 cloud-consumer-hystrix-dashboard9001 cloud-gateway-gateway9527 cloud-config-center-3344 pom UTF-8 1.8 1.8 4.12 1.2.17 1.16.18 8.0.19 1.1.16 2.2.2.RELEASE Hoxton.SR1 2.1.0.RELEASE 1.3.0 org.springframework.boot spring-boot-dependencies ${spring.boot.version} pom import org.springframework.cloud spring-cloud-dependencies ${spring.cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring.cloud.alibaba.version} pom import mysql mysql-connector-java ${mysql.version} com.alibaba druid ${druid.version} org.projectlombok lombok ${lombok.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.spring.boot.version} org.springframework.boot spring-boot-maven-plugin 2.4.11 true true nexus-aliyun Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public true false
子工程pom:
cloud2020 com.wind.springcloud 1.0-SNAPSHOT 4.0.0 cloudalibaba-provider-payment9001 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
2.引入Springboot父工程
如果我们的项目只有单独的一个模块,并且是Springboot项目,可以直接引入Springboot帮我们构建好的模块,如下:
org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE
我们打开这个文件看,可以直接的看到就是一个pom.也就是说我们所有引入的父工程都只是引入一个pom而已,
这也是为什么在前面我们自己构建父工程的时候,打包方式需要设置成pom
我们直接打开spring-boot-starter-parent的pom文件看一下(如下),其实主要有几部分作用.
1.继承自spring-boot-dependencies依赖,在这个父pom中使用
2.指定jdk,字符集等编码.
3.一些打包时的配置
3.直接在自己pom中进行版本管理
举例:
4.3.17.RELEASE
org.springframework
spring-core
${spring.version}
org.springframework
spring-context
${spring.version}
四.解决依赖冲突
主要有两个步骤
1.找到冲突的jar包.
使用mvn命令找到冲突jar包
mvn -Dverbose dependency:tree
输入之后会有下面的内容
[INFO] org.example:hello:jar:1.0-SNAPSHOT [INFO] +- org.springframework:spring-context:jar:5.2.7.RELEASE:compile [INFO] | +- (org.springframework:spring-aop:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] | +- org.springframework:spring-beans:jar:5.2.7.RELEASE:compile [INFO] | | - (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate) [INFO] | +- org.springframework:spring-core:jar:5.2.7.RELEASE:compile [INFO] | | - org.springframework:spring-jcl:jar:5.2.7.RELEASE:compile [INFO] | - org.springframework:spring-expression:jar:5.2.7.RELEASE:compile [INFO] | - (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate) [INFO] - org.springframework:spring-aop:jar:5.2.0.RELEASE:compile [INFO] +- (org.springframework:spring-beans:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE) [INFO] - (org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE)
其中omitted for duplicate表示有jar包被重复依赖,最后写着omitted for conflict with xxx的,说明和别的jar包版本冲突了,而该行的jar包不会被引入。比如上面有一行最后写着omitted for conflict with 5.2.7.RELEASE,表示spring-core 5.2.0版本不会被项目引用,而spring-core 5.2.7版本会被项目引用
2.统一版本
主要有以下三种方式:
-
利用依赖原则统一
就是前面所提到的利用最短路径和优先声明的原则进行统一版本 -
将多余的依赖进行排除
- 第三种方式就是前面提到的利用jar包版本管理方式进行版本统一化.



