maven專案的依賴管理
1 依賴管理-傳遞依賴
1.1 傳遞依賴
1.1.1 什麼是傳遞依賴
當A 依賴B、B依賴C,在A中匯入B後會自動匯入C,C是A的傳遞依賴,如果C依賴D則D也可能是A的傳遞依賴。
演示:
web中新增struts-spring的jar,傳遞依賴了spring
1.1.2 依賴範圍對傳遞依賴的影響(瞭解)
依賴會有依賴範圍,依賴範圍對傳遞依賴也有影響,有A、B、C,A依賴B、B依賴C,C可能是A的傳遞依賴,如下圖:
最左邊一列為直接依賴,理解為
舉例:
比如 A對 B 有 compile 依賴,B 對C有 runtime 依賴,那麼根據表格所示A對C 有 runtime 依賴。
測試
dao依賴junit,scop為test
service依賴dao.
檢視下圖紅色框內所示傳遞依賴範圍:
所以maven-first所依賴的junit的jar沒有加入到maven-web工程。
如果修改maven-first依賴
1.2 依賴版本衝突解決
1.2.1 問題
當一個專案依賴的構件比較多時,它們相互之前存在依賴,當你需要對依賴版本統一管理時如果讓maven自動來處理可能並不能如你所願,如下例子:
同時加入以下依賴,觀察依賴:
<!-- struts2-spring-plugin依賴spirng-beans-3.0.5 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
<!-- spring-context依賴spring-beans-4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
org.apache.struts依賴spirng-beans-3.0.5,spring-context依賴spring-beans-4.2.4,但是發現spirng-beans-3.0.5加入到工程中,而我們希望spring-beans-4.2.4加入工程。
1.2.2 依賴調解原則
maven自動按照下邊的原則調解:
ü 1、第一宣告者優先原則
在pom檔案定義依賴,先宣告的依賴為準。
測試:
如果將上邊struts-spring-plugins和spring-context順序顛倒,系統將匯入spring-beans-4.2.4。
分析:
由於spring-context在前邊以spring-context依賴的spring-beans-4.2.4為準,所以最終spring-beans-4.2.4新增到了工程中。
ü 2、路徑近者優先原則
例如:A依賴 spirng-beans-4.2.4,A依賴B依賴 spirng-beans-3.0.5,則spring-beans-4.2.4優先被依賴在A中,因為spring-beans-4.2.4相對spirng-beans-3.0.5被A依賴的路徑最近。
測試:
在本工程中的pom中加入spirng-beans-4.2.4的依賴,根據路徑近者優先原則,系統將匯入spirng-beans-4.2.4:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
1.2.3 排除依賴
上邊的問題也可以通過排除依賴方法輔助依賴調解,如下:
比如在依賴struts2-spring-plugin的設定中新增排除依賴,排除spring-beans,
下邊的配置表示:依賴struts2-spring-plugin,但排除struts2-spring-plugin所依賴的spring-beans。
<!-- struts2-spring-plugin依賴spirng-beans-3.0.5 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<!-- 排除 spring-beans-->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
1.2.4 鎖定版本
面對眾多的依賴,有一種方法不用考慮依賴路徑、宣告優化等因素可以採用直接鎖定版本的方法確定依賴構件的版本,版本鎖定後則不考慮依賴的宣告順序或依賴的路徑,以鎖定的版本的為準新增到工程中,此方法在企業開發中常用。
如下的配置是鎖定了spring-beans和spring-context的版本:
<dependencyManagement>
<dependencies>
<!--這裡鎖定版本為4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
注意:在工程中鎖定依賴的版本並不代表在工程中添加了依賴,如果工程需要新增鎖定版本的依賴則需要單獨新增<dependencies></dependencies>標籤,如下:
<dependencies>
<!--這裡是新增依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
上邊新增的依賴並沒有指定版本,原因是已在<dependencyManagement>中鎖定了版本,所以在<dependency>下不需要再指定版本。