1. 程式人生 > >maven專案的依賴管理

maven專案的依賴管理

依賴管理-傳遞依賴

1.1 傳遞依賴

1.1.1  什麼是傳遞依賴

A 依賴BB依賴C,在A中匯入B後會自動匯入CCA的傳遞依賴,如果C依賴DD也可能是A的傳遞依賴

 

演示:

web中新增struts-springjar,傳遞依賴了spring

 

 

1.1.2 依賴範圍對傳遞依賴的影響(瞭解)

依賴會有依賴範圍,依賴範圍對傳遞依賴也有影響,有ABCA依賴BB依賴CC可能是A的傳遞依賴,如下圖:

 

 

最左邊一列為直接依賴,理解為

A依賴B的範圍,最頂層一行為傳遞依賴,理解為B依賴C的範圍,行與列的交叉即為A傳遞依賴C的範圍。

舉例:

比如 A compile 依賴,C runtime 依賴,那麼根據表格所示A runtime 依賴。

 

測試

dao依賴junitscoptest

service依賴dao.

 

檢視下圖紅色框內所示傳遞依賴範圍:

 

 

所以maven-first所依賴的junitjar沒有加入到maven-web工程。

如果修改maven-first依賴

junitscopcompilemaven-first所依賴的junitjar包會加入到maven-web工程中,符合上邊表格所示,檢視下圖紅色框內所示:

 

 

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-pluginsspring-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.4A依賴B依賴 spirng-beans-3.0.5,則spring-beans-4.2.4優先被依賴在A中,因為spring-beans-4.2.4相對spirng-beans-3.0.5A依賴的路徑最近。

測試:

在本工程中的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-beansspring-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>下不需要再指定版本。