maven傳遞依賴衝突解決
阿新 • • 發佈:2019-01-02
傳遞依賴: 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