Maven的依賴機制介紹


以下內容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_manage_dependencies.html

一、前言

Maven的一個核心特性就是依賴管理。當我們涉及到多模塊的項目(包含成百個模塊或者子項目),管理依賴就變成一項困難的任務。Maven展示出了它對處理這種情形的高度控制。

二、可傳遞性依賴

一種相當常見的情況,當一個庫,比如說A依賴於其他庫B。假如,另外一個項目C想要使用A,那么項目也需要使用庫B

Maven幫助避免這種要查明所有所需庫的要求。Maven通過讀取描述依賴的項目文件(pom.xml),找出它們的依賴類,來完成這項工作。

我們只需要做的是在每個項目的pom.xml中定義好直接的依賴。Maven會自動處理剩下的事情。

通過可傳遞性的依賴,被包含庫的關系圖可以迅速增加到一個很大的程度。當有多個庫時可能就會有狀況發生。Maven提供一些特性來控制可傳遞性依賴的大小。

特性 描述

依賴調解(Dependency mediation

當遇到多個版本的artifact的時候,決定使用哪個版本的依賴。如果兩個版本的依賴在依賴樹種處於同一深度時,第一個被聲明的依賴將被使用。

依賴管理(Dependency management

當在傳遞性依賴中遇到時,直接指定要使用的構件版本。舉個例子,項目C可以在dependencyManagement部分配置包含B作為依賴,並且直接控制引用B時使用哪個版本的B

依賴作用域(Dependency scope

按照當前構建的階段,配置包含的依賴。

排除依賴(Excluded dependencies

任何傳遞性的依賴都可以通過使用<exclusion>節點來排除。舉個例子,A依賴於B並且B依賴於C,那么A可以標記C為排除在外的。

可選依賴(Optional dependencies

任何傳遞性的依賴都可以通過使用<optional>節點來標記為可選的。舉個例子,A依賴於B並且B依賴於C,現在B標記C為可選的,那么A可以不使用C

三、依賴作用域(Dependency Scope)

可傳遞性依賴發現可以通過下面提到的各種依賴作用域來限制。

作用域(Scope) 描述
compile 此作用域表示項目classpath中的依賴可以使用,為默認作用域。
provided 此作用域表示依賴將由JDK或者運行時的Web服務器或容器提供。
runtime 此作用域表示依賴在編譯時不需要,但在執行時需要。
test 此作用域表示依賴只在測試編譯和執行階段可用。
system 此作用域表示你必須提供系統路徑。
import 此作用域只在依賴是POM類型時使用。此作用域表示特定的POM需要替換成被引入的POM的部分中的依賴。

提示:這個作用於就是<dependency>節點下的<scope>。

四、依賴管理(Dependency Management)

通常我們有基於某個通用項目的一組項目。 在此情形下, 我們可以創建一個通用的POM來把所有的通用的依賴包含進來,並把這個POM作為子項目POM的父POM。下面的例子將幫助你理解這個概念。

接下來是上面依賴圖的詳情說明:

  • App-UI-WAR依賴於App-Core-libApp-Data-lib

  • RootApp-Core-libApp-Data-lib的父項目。

  • Root在它的依賴部分定義了Lib1Lib2Lib3作為依賴。

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項目中列出的。

  • App-UI-WAR項目中不需要指定Lib1Lib2Lib3作為依賴。Maven使用可傳遞性依賴機制(Transitive Dependency Mechanism)可處理這種細節。

五、其它參考

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM