Maven依賴管理的用法介紹
一、依賴傳遞
1. 直接依賴與間接依賴
pom.xml 聲明瞭的依賴是直接依賴,依賴中又包含的依賴就是間接依賴(直接依賴的直接依賴),間接依賴雖然未被聲明,但也是依賴所必須的依賴,同時間接依賴中的資源也可以直接使用
比如 A 依賴瞭 B,B 依賴瞭 C,那麼 A 也就間接的依賴瞭 C,如果沒有 C,那麼 A 和 B 都無法正常運行,A 也可以直接使用 C 的內容,而可以不必再聲明 C
實例如 spring-webmvc:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency>
學習 Spring 時需要導入 spring-context 依賴,但學習 SpringMVC 時,我們會導入 spring-webmvc,此時即便會用到 Spring 的功能也無需再導入 spring-context。因為 spring-webmvc 依賴瞭 spring-context,spring-context 作為間接依賴被引入到瞭項目中,可以直接使用
2. 依賴傳遞沖突時的優先規則
假如一個項目中或直接或間接的多次導入瞭同一個依賴,就會產生依賴沖突,此時 Maven 會按照下面三種優先規則確定真正依賴的是哪個包:(主要討論不同版本的依賴,相同版本沒什麼所謂)
(1) 路徑優先
直接依賴優先級最高,其次是間接依賴,然後是間接依賴的直接依賴,間接依賴的間接依賴 ……
層級越深,優先級越低,或者說就近原則,離項目最近的包就是項目真正所依賴的
如下例:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.19.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>
示例中引入瞭 spring-context 5.1.19 為直接依賴,又引入 spring-webmvc 5.2.10,其中又依賴瞭 spring-context 5.2.10,但它是間接依賴,所以項目中所使用的 spring-context 資源是 5.1.19 版本的(但並不代表 webmvc 中的 context 版本也被改為瞭 5.1.19),圖中也可以看到 IDEA 在依賴後邊給出瞭沖突標識
(2) 聲明優先
相同層級的依賴資源,先被聲明的優先
如下例:(和剛才的一樣)
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.19.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>
和上面一樣導入 spring-context 5.1.19 和 spring-webmvc 5.2.10,可以看到 context 和 webmvc 都又依賴瞭 aop, beans, core 等幾個包,且都是間接依賴,層級相等,但由於先聲明的 context 5.1.19,所以其中的 aop, core 等幾個包的優先級更高
(3) 後聲明覆蓋先聲明
同時聲明瞭同一個依賴的不同版本,那麼先聲明的版本會被最後聲明的版本覆蓋掉(以最後一次聲明為準)
如下例:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.19.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>
先聲明 spring-context 5.1.19,又聲明瞭 spring-context 5.2.10,最後使用的依賴版本為 5.2.10
二、依賴管理
分模塊開發時,合理的管理依賴能夠避免掉依賴沖突可能帶來的麻煩。
1. 可選依賴
用於對外隱藏本項目中使用的依賴。如果項目中將某個依賴設置為可選依賴,那麼其他項目引用此項目時不會加載到可選依賴。
隻需在聲明依賴時加入 optional 標簽,設置值為 true 即可(默認為 false)
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.19.RELEASE</version> <optional>true</optional> </dependency>
如上設置後,其他項目引入此項目時,不會加載到此項目中的 spring-context 5.1.19
2. 排除依賴
引入依賴時,用於排除掉該依賴中傳遞來的指定依賴。
需要在聲明依賴時加入 exclusions 標簽,內含多個 exclusion,設置 要排除的依賴坐標,不必指定版本
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency>
如上設置後,本項目不會加載 spring-webmvc 依賴中包含的 spring-aop 和 spring-core
3. 可選依賴與排除依賴的異同點
相同點:
- 功能相同:都用於阻斷依賴的傳遞
不同點:
- 原理不同:可選依賴對外不透明,排除依賴有傳遞但不采用
- 生效時機不同:可選依賴生效在項目被引入時,排除依賴生效在引入其他項目時
到此這篇關於Maven依賴管理的用法介紹的文章就介紹到這瞭,更多相關Maven依賴管理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- java maven進階教學
- 關於springboot集成swagger3時spring-plugin-core報錯的問題
- 一文帶你搞懂Maven的繼承與聚合
- 關於pom.xml中maven無法下載springcloud包問題
- 教你使用idea搭建ssm詳細教程(Spring+Spring Mvc+Mybatis)