Maven依賴的傳遞性

依賴是具有傳遞性的,程與工程之間也是有依賴關係的。
在這裏插入圖片描述

依賴具有傳遞性

仔細查看crm-web子工程的結構,此時可以看到,它不僅把crm-service子工程依賴進來了,而且還把crm-dao子工程也依賴進來了,這是因爲依賴具有傳遞性。
在這裏插入圖片描述
如果MakeFriends.jar直接依賴於HelloFriend.jar,而HelloFriend.jar又直接依賴於Hello.jar,那麼MakeFriends.jar也依賴於Hello.jar,這就是傳遞性依賴,只不過這種依賴是間接依賴。
在這裏插入圖片描述

依賴的傳遞範圍

如果crm-dao子工程開發完畢了,那麼緊接着就要編寫JUnit單元測試用例了。相應地,就要在pom.xml文件中添加JUnit的依賴了,並且scope要置爲test。查看crm-dao發現junit-4.9.jar這個jar包確實引入了,這是毋庸置疑的。
crm-service子工程直接依賴於crm-dao子工程,而crm-dao子工程又直接依賴於junit-4.9.jar,由於依賴具有傳遞性,那麼想必crm-service子工程也會依賴於junit-4.9.jar。
並不是這樣
查看crm-service子工程的結構,你就知道該工程中並沒有引入junit-4.9.jar這個jar包。
爲什麼呢
其實依賴傳遞也是有範圍的,傳遞依賴不能無休止的往下面傳遞下去。
在這裏插入圖片描述
以上表格中的中間部分即是傳遞依賴的範圍,可見傳遞依賴不是無休止的往下面傳遞下去的。

依賴傳遞的兩個原則

依賴傳遞有兩個原則,一個是第一聲明者優先原則,另一個是路徑近者優先原則。下面我會對這兩個原則進行詳細闡述。

  1. 第一聲明者優先原則
    當項目的依賴中,其中有多個依賴同時依賴同一個依賴時,優先使用聲明靠前的依賴,即:第一聲明者優先原則
<!-- 依賴管理的第一個原則:第一聲明者優先原則(誰先聲明,誰先用) -->
<!-- 下面這個會引入spring-beans-4.2.2.RELEASE.jar,但是最後生效的只有這個spring-beans-4.2.2.RELEASE版本的jar包 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.2.2.RELEASE</version>
</dependency>
<!-- 下面這個會引入spring-beans-3.0.5.RELEASE.jar -->
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>2.3.24</version>
</dependency>
  1. 路徑近者優先原則
<!-- 下面這個會引入spring-beans-4.2.2.RELEASE.jar -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.2.2.RELEASE</version>
</dependency>
<!-- 下面這個會引入spring-beans-3.0.5.RELEASE.jar -->
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>2.3.24</version>
</dependency>
<!-- 依賴管理的第二個原則:路徑近者優先原則 -->
<!-- 這個spring-beans-4.2.4.RELEASE版本的jar包放到最後面去了,但是它還是生效了。那這是爲啥啊? -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>

此時,工程中如果要引入spring-beans,可以有以下方法:

  • 通過引入struts2-spring-plugin-2.3.24.jar,它會引入spring-beans-.3.0.5.RELEASE這個版本的jar包,但需要經過的路徑爲2個節點;
  • 通過引入spring-context-4.2.2.RELEASE.jar,它會引入spring-beans-.4.2.2.RELEASE這個版本的jar包,但需要經過的路徑也爲2個節點;
  • 如果直接引入spring-beans-4.2.4.RELEASE.jar,那麼只需要經過1個節點。

因此不管spring-beans-4.2.4.RELEASE.jar的位置在哪,工程中始終都是引入spring-beans-4.2.4.RELEASE這個版本的jar包。這就是所謂的路徑近者優先原則。

發佈了27 篇原創文章 · 獲贊 0 · 訪問量 684
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章