Maven實戰(七)---傳遞依賴

假設A-->C  B-->A      ==> B-->C A依賴於C是直接依賴,B依賴於A是直接依賴,B依賴於C是傳遞依賴。

 

現象一

         

       舉個例子:A-->log1.0  B-->log2.0 C-->A,B 那麼我們來看依賴關係:

          User-core依賴於log4j 1.2.17

  1. <dependency>  
  2.             <groupId>log4j</groupId>  
  3.             <artifactId>log4j</artifactId>  
  4.             <version>1.2.17</version>  
  5.         </dependency>  
 

         User-log包依賴於log4j 1.2.9

  1. <dependency>  
  2.             <groupId>log4j</groupId>  
  3.             <artifactId>log4j</artifactId>  
  4.             <version>1.2.9</version>  
  5.         </dependency>  

 

        User-service依賴於user-core,也依賴於user-log


      

       可以看出user-service依賴的log4j的版本號爲1.2.9。因爲先依賴的log,後依賴於core,user-service依賴log4j相當於間接依賴。因此當有間接依賴的時候先依賴的哪個,就會依賴哪個包的間接依賴。

總結:間接依賴,如果級別相同,依賴於先引用的依賴。

 

 

現象二

         

       先依賴於user-core,再依賴於user-log.下面看commons-logging.jar的版本號:


                          

           User-core裏面的Commons-logging的版本號爲1.0.4

           User-log裏面的Commons-logging的版本號爲1.1.1

           User-service裏面Commons-logging的版本號爲1.1.1

 

        按照第一種,user-service裏面的jar版本應該爲1.0.4,現在爲什麼是1.1.1呢?

         我們來解析:



         User-core裏面依賴於dbunit,而commons-logging.jar是作爲依賴項被引用下來的

         User-log裏面是直接引用commons-logging.jar

      因此它們處於不同的依賴樹上,深度越淺越被優先選擇。

 

小結

         1.在工程的依賴樹上,深度越淺,越被有限選擇。

         2.若兩個依賴包處於依賴樹上的同一層,則誰在前選擇誰。

      

          總之,避免傳遞依賴時引起版本問題出現的最佳實踐。一般情況下,如果工程直接依賴到某一框架的多個模塊,最好全部聲明這些依賴。

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