Maven Jar抵触时咱们在开发过程中最常见并且头大的问题,经历几回后,不要再“一顿操作猛如虎,定睛一看原地杵”。先了解一下Jar抵触的原理,再遇到的时分不再“一腔怒火砸键盘”了。
原理
依靠传递
当项目引入A依靠时,同时A依靠引入了B,B或许引入了C。最后,Maven会把一切相关的依靠都添加到项目中,好处是不用自己去添加一切依靠的Jar包了,但是或许会引起Jar抵触。
举个栗子,比如spring boot工程中,引入spring-boot-starter-web:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(不同级)最短途径优先准则
两个版别不同的同一个依靠,在不同的级别中,会优先运用途径最短的一个。
pom -> A -> B -> W(14.0.1)
pom -> A -> C -> D -> W(12.0.1)
终究会优先引入W(14.0.1)。
(同级)声明优先准则
后声明优先:两个版别不同的同一个依靠,若都在第一级,会优选运用后声明的依靠。
pom -> W(14.0.1)
pom -> W(12.0.1)
终究会优选引入W(12.0.1)。
先声明优先:不在第一级的话,会优选运用先声明的依靠。
pom -> A -> W(14.0.1)
pom -> B -> W(12.0.1)
终究会优选引入W(14.0.1)。
Jar包抵触原因
首先,在平时开发中或许会因Jar抵触遇到的反常有:
java.lang.ClassNotFoundException
java.lang.NoSuchMethodError
java.lang.NoClassDefFoundError
依据上面讲的准则,每一个准则都会导致Jar抵触。所谓的Jar抵触,便是项目终究引入的依靠,程序在某个方法运用了低于/高于内设版别的jar包,没有找到对应的类或方法,导致程序错误。
排查Jar抵触
IDEA Maven Diagrams
运用IDEA自带Maven插件,在pom.xml右键,挑选Diagrams,点击show Dependencies,检查Maven依靠层级结构。
红色线表明抵触,能够看到Maven挑选了哪个版别的依靠。
Maven Helper
装置Maven Helper插件,直接能够看到发生抵触的依靠。
右键能够直接扫除抵触的依靠,会自动在pom.xml添加扫除属性。
mvn dependency
本地开发能够凭借IDEA来排查Jar包抵触,那在测验或出产环境的话,能够运用mvn指令来定位抵触。
#打印依靠树
mvn dependency:tree
#将依靠树打印到文件中
mvn dependency:tree > a.txt
#打印包括某些包的依靠树
mvn dependency:tree -Dincludes=guava
处理Jar包抵触
exclude 扫除
在pom.xml经过exclude扫除,如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
指定版别
在许多情况下,选用exclude扫除的话,或许需要扫除的方位许多,能够依据上面说到的准则,在pom.xml直接引证指定版别的依靠,这种方法的优先级最高。
其它小技巧
服务器检查Jar包版别
jar tf jar包称号