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>

别再因为Jar包冲突砸键盘了

(不同级)最短途径优先准则

两个版别不同的同一个依靠,在不同的级别中,会优先运用途径最短的一个。

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依靠层级结构。

别再因为Jar包冲突砸键盘了

别再因为Jar包冲突砸键盘了

红色线表明抵触,能够看到Maven挑选了哪个版别的依靠。

Maven Helper

装置Maven Helper插件,直接能够看到发生抵触的依靠。

别再因为Jar包冲突砸键盘了

别再因为Jar包冲突砸键盘了

别再因为Jar包冲突砸键盘了

右键能够直接扫除抵触的依靠,会自动在pom.xml添加扫除属性。

mvn dependency

本地开发能够凭借IDEA来排查Jar包抵触,那在测验或出产环境的话,能够运用mvn指令来定位抵触。

#打印依靠树
mvn dependency:tree 		
#将依靠树打印到文件中
mvn dependency:tree > a.txt 
#打印包括某些包的依靠树
mvn dependency:tree -Dincludes=guava

别再因为Jar包冲突砸键盘了

处理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包称号

别再因为Jar包冲突砸键盘了