傳遞依賴: A.jar 依賴 B.jar, B.jar 依賴 C.jar, 這個時候我們就說B是A的直接依賴, C是A傳遞依賴;
傳遞依賴可能會產生衝突: 聯繫着上面, 新導入一個jar包D.jar, D依賴C.jar, 但是B依賴的1.1版本, 而D依賴的是1.2版本, 這時候C這個jar包的兩個版本, 如果同時被Maven導入工程, 衝突就出現了!
針對這種衝突
一: Maven有自己的處理原則:
在 pom.xml 中
1. 聲明者優先原則:那個先聲明, 就用那個的傳遞依賴
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.34</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
2. 路徑/座標優先原則:直接依賴的優先級別要高於傳遞依賴
二. pom.xml 代碼來處理:
1. 排除依賴
注意: 不需要的排除掉, 不是排除掉所用的包!
2. 版本鎖定(推薦使用)
<!-- 版本鎖定: dependencyManagement 它不會把jar包導入,只是鎖定版本, 在 pom.xml 中jar包的版本號還可以鎖定,繼承該工程的子過程裏對應的jar包的版本號 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.16.RELEASE</version> <!-- 鎖定spring-beans版本號,傳遞依賴會自定導包 -->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version> <!-- 鎖定struts2-spring-plugin版本號 -->
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!-- 有版本鎖定 就不需要自定版本號啦 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.34</version>
</dependency>
</dependencies>
scope的依賴傳遞
A依賴B,B依賴C。當前項目爲A,只當B在A項目中的scope,那麼c在A中的scope是如何得知呢?
當C是test或者provided時,C直接被丟棄,A不依賴C;(排除傳遞依賴)
否則A依賴C,C的scope繼承與B的scope