
- Maven 教程
- Maven - 首頁
- Maven - 概述
- Maven - 環境搭建
- Maven - POM
- Maven - 構建生命週期
- Maven - 構建配置檔案
- Maven - 倉庫
- Maven - 外掛
- Maven - 建立專案
- Maven - 構建和測試專案
- Maven - 外部依賴
- Maven - 專案文件
- Maven - 專案模板
- Maven - 快照
- Maven - 構建自動化
- Maven - 依賴管理
- Maven - 部署自動化
- Maven - Web 應用
- Maven - Eclipse IDE
- Maven - NetBeans
- Maven - IntelliJ IDEA
- Maven 有用資源
- Maven - 常見問題解答
- Maven - 快速指南
- Maven - 有用資源
- Maven - 討論
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 的父級。下面的示例將幫助您理解這個概念。

以下是上述依賴關係圖的詳細資訊:
- 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-lib 和 App-Core-lib 專案的依賴項列在 Root 專案中(參見 Root 的打包型別。它是 POM)。
無需在 App-UI-WAR 中指定 Lib1、lib2、Lib3 作為依賴項。Maven 使用傳遞依賴機制來管理此類細節。