一、傳遞依賴
官方文檔解釋的傳送門:http://ifeve.com/maven-dependency-mechanism/
當存在傳遞依賴的情況時,主工程對間接依賴的jar可以訪問嗎?
例如:A.jar依賴於B.jar,而B.jar依賴於C.jar,那么要怎么修改配置文件,才會讓A.jar 也依賴 B.jar 呢?
這要看傳遞依賴的jar包引入時的依賴范圍——只有依賴范圍為compile時可以訪問
即 要使A.jar 依賴於C.jar 當且僅當C.jar的范圍是compile
如下演示HelloWrold2項目依賴 ——》HelloWrold項目依賴——》junit
此時HelloWrold這個項目是有junit.jar包的,而HelloWrold2是沒有junit這個jar包的,如下所示:
需要在被依賴的項目HelloWorld的pom.xml上改寫
改寫之后,項目就出現了需要間接依賴的的jar包
二、依賴原則
依賴原則目的:防止jar包的沖突
為了避免造成依賴重復,需要選擇一個依賴路徑
1. 路徑最短優先原則
存在兩個項目依賴同個類型但不同版本的jar包,這個時候會優先選擇路徑短的
項目配置情況:
HelloWrold2 依賴 HelloWrold
HelloWrold 依賴 Junit3.8 jar
HelloWrold 依賴 Junit4.0 jar
從圖中看,顯然junit3.8距離HelloWrold2更近點的
既然都擁有junit這個包,那么原本是 3.8 的 HelloWrold2 再依賴了HelloWrold后,會發生什么情況呢??
配置如下:
運行結果如圖所示:此時HelloWrold保持原來的junit-3.8.jar不變
2. 路徑長度相同
路徑長度相同的情況下,又可以分為是否有在同一個pom.xml兩種情況
2.1 覆蓋:
如果在同一pom.xml文件中有2個相同的依賴;后面聲明的會覆蓋前面的依賴
但這里要說嚴禁使用本情況,嚴禁在同一個pom中聲明兩個不同的依賴
2.2 優先:
如果是在不同pom.xml中有2個相同的依賴;則先聲明的依賴,會覆蓋后面生命的依賴
如下HelloWorld2依賴項目HelloWorld,和項目HelloWorld3
HelloWorld與HelloWorld3都有不同版本的commons-fileupload.jar
顯然,先寫在前面的HelloWorld3的jar包被采用了
簡單的依賴就完了呢~ o(* ̄▽ ̄*)o