Maven - 依賴管理



Maven 的核心功能之一是依賴管理。當我們處理多模組專案(包含數百個模組/子專案)時,管理依賴是一個難題。Maven 提供了高度的控制來管理此類場景。

傳遞依賴發現

經常出現這種情況,一個庫(例如 A)依賴於另一個庫(例如 B)。如果另一個專案 C 想使用 A,則該專案也需要使用庫 B。

Maven 有助於避免發現所有必需庫的此類需求。Maven 透過讀取依賴項的專案檔案 (pom.xml) 、找出它們的依賴項等等來實現。

我們只需要在每個專案的 pom 中定義直接依賴。Maven 會自動處理其餘部分。

使用傳遞依賴,包含的庫圖可能會迅速增長到很大程度。可能會出現重複庫的情況。Maven 提供了一些功能來控制傳遞依賴的範圍。

序號 功能和描述
1

依賴仲裁

確定在遇到多個版本的構件時要使用哪個版本的依賴項。如果兩個依賴項版本在依賴樹中處於相同的深度,則將使用第一個宣告的依賴項。

2

依賴管理

直接指定在傳遞依賴中遇到時要使用的構件版本。例如,專案 C 可以在其依賴管理部分中包含 B 作為依賴項,並直接控制在引用 B 時要使用的 B 的版本。

3

依賴範圍

根據構建的當前階段包含依賴項。

4

排除依賴

可以使用“exclusion”元素排除任何傳遞依賴項。例如,A 依賴於 B,而 B 依賴於 C,則 A 可以將 C 標記為排除項。

5

可選依賴

可以使用“optional”元素將任何傳遞依賴項標記為可選。例如,A 依賴於 B,而 B 依賴於 C。現在 B 將 C 標記為可選。那麼 A 將不會使用 C。

依賴範圍

可以使用下面提到的各種依賴範圍來限制傳遞依賴發現。

序號 範圍和描述
1

compile

此範圍表示依賴項在專案的類路徑中可用。這是預設範圍。

2

provided

此範圍表示依賴項應由 JDK 或 Web 伺服器/容器在執行時提供。

3

runtime

此範圍表示編譯不需要依賴項,但在執行期間需要。

4

test

此範圍表示依賴項僅在測試編譯和執行階段可用。

5

system

此範圍表示您必須提供系統路徑。

6

import

此範圍僅在依賴項型別為 pom 時使用。此範圍表示應將指定的 POM 替換為該 POM 的``部分中的依賴項。

依賴管理

通常,我們在一個公共專案下有一組專案。在這種情況下,我們可以建立一個包含所有公共依賴項的公共 pom,然後將此 pom 作為子專案 pom 的父級。下面的示例將幫助您理解這個概念。

dependency graph

以下是上述依賴關係圖的詳細資訊:

  • App-UI-WAR 依賴於 App-Core-lib 和 App-Data-lib。
  • Root 是 App-Core-lib 和 App-Data-lib 的父級。
  • Root 在其依賴項部分中定義 Lib1、lib2、Lib3 作為依賴項。

App-UI-WAR

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-UI-WAR</artifactId>
   <version>1.0</version>
   <packaging>war</packaging>
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname</groupId>
         <artifactId>App-Core-lib</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname</groupId>
         <artifactId>App-Data-lib</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
</project>

App-Core-lib

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
      <artifactId>Root</artifactId>
      <groupId>com.companyname.groupname</groupId>
      <version>1.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-Core-lib</artifactId>
   <version>1.0</version> 
   <packaging>jar</packaging>
</project>

App-Data-lib

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
      <artifactId>Root</artifactId>
      <groupId>com.companyname.groupname</groupId>
      <version>1.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-Data-lib</artifactId>
   <version>1.0</version>   
   <packaging>jar</packaging>
</project>

Root

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>Root</artifactId>
   <version>1.0</version>
   <packaging>pom</packaging>
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname1</groupId>
         <artifactId>Lib1</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname2</groupId>
         <artifactId>Lib2</artifactId>
         <version>2.1</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname3</groupId>
         <artifactId>Lib3</artifactId>
         <version>1.1</version>
      </dependency>
   </dependencies>  
</project>

現在,當我們構建 App-UI-WAR 專案時,Maven 將透過遍歷依賴關係圖來發現所有依賴項並構建應用程式。

從上面的示例中,我們可以學習以下關鍵概念:

  • 可以使用父 pom 的概念將公共依賴項放在單個位置。App-Data-libApp-Core-lib 專案的依賴項列在 Root 專案中(參見 Root 的打包型別。它是 POM)。

  • 無需在 App-UI-WAR 中指定 Lib1、lib2、Lib3 作為依賴項。Maven 使用傳遞依賴機制來管理此類細節。

廣告