做淘宝门头的网站,阿里巴巴官网app,优化电池充电有必要开吗,网站建设必须要在阿里云备案吗什么是依赖冲突
依赖冲突是指项目依赖的某一个jar包#xff0c;有多个不同的版本#xff0c;因而造成类包版本冲突
依赖冲突的原因
依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包#xff0c;这些隐式的类包会被maven间接引…什么是依赖冲突
依赖冲突是指项目依赖的某一个jar包有多个不同的版本因而造成类包版本冲突
依赖冲突的原因
依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包这些隐式的类包会被maven间接引入进来从而造成类包冲突
如何解决依赖冲突
首先查看产生依赖冲突的类jar其次找出我们不想要的依赖类jar手工将其排除在外就可以了。具体执行步骤如下
1、查看依赖冲突 a、通过dependency:tree是命令来检查版本冲突 mvn -Dverbose dependency:tree
1当敲入上述命令时控制台会出现形如下内容
[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)
123456789101112其中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版本会被项目引用 b、如果是idea可以安装maven helper插件来检查依赖冲突 maven helper插件安装成功点开pom.xml会发现多了一个Dependency Analyzer视图如下 上面按钮的图标含义如下
Conflicts查看冲突All Dependencies as List列表形式查看所有依赖All Dependencies as Tree树形式查看所有依赖
上图说明有3个jar存在冲突点击冲突的jar可以查看和哪个jar产生冲突如下图
2、解决冲突
项目的pom.xml形如下 dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.7.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.2.0.RELEASE/version/dependency/dependencies12345678910111213141516通过查看依赖树我们知道项目会引用5.2.7.RELEASE的spring core jar包而不会引用5.2.0的jar包如果我们想用5.2.0版本的spring core包我们该如何做 a、使用第一声明者优先原则 谁先定义的就用谁的传递依赖即在pom.xml文件自上而下先声明的jar坐标就先引用该jar的传递依赖。因此我们如果要使用5.2.0版本的spring core包我们可以改成如下声明 dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.2.0.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.7.RELEASE/version/dependency/dependencies123456789101112131415查看依赖树
[INFO] org.example:hello:jar:1.0-SNAPSHOT
[INFO] - org.springframework:spring-aop:jar:5.2.0.RELEASE:compile
[INFO] | - org.springframework:spring-beans:jar:5.2.0.RELEASE:compile
[INFO] | | \- (org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for duplicate)
[INFO] | \- org.springframework:spring-core:jar:5.2.0.RELEASE:compile
[INFO] | \- org.springframework:spring-jcl:jar:5.2.0.RELEASE:compile
[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 - omitted for conflict with 5.2.0.RELEASE)
[INFO] - (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE)
[INFO] \- org.springframework:spring-expression:jar:5.2.7.RELEASE:compile
[INFO] \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE)12345678910111213通过依赖树我们可以看到项目已经引入5.2.0版本的spring core包 b、使用路径近者优先原则 即直接依赖级别高于传递依赖。因此我们可以在最先的pom.xml添加如下内容 dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.7.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.2.0.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion5.2.0.RELEASE/version/dependency/dependencies
12345678910111213141516171819202122通过上图可以看到项目引入是 spring core 5.2.0的包 c、排除依赖 排除依赖如果是idea可以使用maven helper插件进行排除。点开pom.xml切换到Dependency Analyzer视图选择All Dependencies as Tree点击要排除的jar右键会出现Execlude选项如下 它产生的效果和如下配置是一样 dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.7.RELEASE/versionexclusionsexclusionartifactIdspring-core/artifactIdgroupIdorg.springframework/groupId/exclusion/exclusions/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.2.0.RELEASE/version/dependency/dependencies123456789101112131415161718192021通过上图可以看到项目引入是 spring core 5.2.0的包 4、版本锁定 使用dependencyManagement 进行版本锁定dependencyManagement可以统一管理项目的版本号确保应用的各个项目的依赖和版本一致。
如果我们项目中只想使用spring core 5.2.0的包pom.xml可以改为如下
dependencyManagementdependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion5.2.0.RELEASE/version/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.7.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.2.0.RELEASE/version/dependency/dependencies12345678910111213141516171819202122232425通过上图可以看到项目引入是 spring core 5.2.0的包
总结
综上就是maven如何排查依赖冲突以及解决方法对于排查依赖个人比较推荐使用maven helper插件至于解决依赖冲突个人推荐使用版本锁定的方法此外dependencyManagement只是声明依赖并不自动实现引入因此子项目需要显示的声明需要用的依赖