1 傳遞性依賴
1.1 傳遞性依賴機制
- Maven自動遞歸解析所有依賴,然后將依賴下載,作為項目的依賴
1.2 傳遞性依賴規(guī)則
- 第一列為一級依賴
- 第一行為二級依賴
| compile | test | provided | runtime | |
|---|---|---|---|---|
| compile | compile | runtime | ||
| test | test | test | ||
| provided | provided | provided | provided | |
| runtime | runtime | runtime |
例1:
項目依賴A(scope為compile),A依賴于B(scope為test)
此時項目對B的依賴范圍為空
因為B是給A測試使用,項目依賴A是compile,項目無需依賴B
例2:
項目依賴junit(單元測試,scope為test),junit依賴hamcrest-core(scope為默認(rèn)compile)
項目對hamcrest-core的依賴范圍為test
2 依賴沖突調(diào)節(jié)
2.1 依賴沖突產(chǎn)生原因
maven自動解析所有層級依賴,自動下載所有依賴,會導(dǎo)致依賴沖突問題
2.2 就近原則解決沖突
project -> pagehelper -> spring-core -> log4j-2.0
project -> spring-mybatis -> log4j-1.0
此時Maven遵循就近原則使用log4j-1.0
2.3 第一聲明原則解決沖突
project -> pagehelper -> log4j-2.0
project -> spring-mybatis -> log4j-1.0
此時Maven遵循第一聲明原則,log4j-2.0在log4j-1.0前聲明,使用log4j-2.0
3 XXX not found
3.1 問題產(chǎn)生
project -> pagehelper -> spring-core -> log4j-2.0
project -> spring-mybatis -> log4j-1.0
- 此時就近原則生效,項目依賴log4j-1.0
- pagehelper依賴spring-core,spring-core依賴log4j-2.0
- 項目使用spring-core的A方法,A方法依賴log4j-2.0中的類或方法,就會拋出xxx not found問題
3.2 解決
- 遵循最新版本原則
當(dāng)項目依賴某jar包的多個版本時,優(yōu)先使用最新版本,將低版本依賴排除
為了舉例說明,實際依賴可能并非如此
project -> pagehelper -> spring-core -> log4j-2.0
project -> spring-mybatis -> log4j-1.0
- 此時就近原則生效,項目依賴log4j-2.0,需將log4j-2.0依賴排除
- 查看項目依賴樹
命令行
mvn dependency:tree

image.png
Maven Helper插件

image.png

image.png
- 將pagehelper中mybatis排除依賴
<!-- pageHelper 中mybatis依賴與 下面沖突 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 整合mybatis配置 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
- 再次查看項目依賴樹,項目依賴如下(只剩下log4j-2.0)
project -> pagehelper -> spring-core -> log4j-2.0
project -> spring-mybatis