假設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
User-log包依賴於log4j 1.2.9
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.若兩個依賴包處於依賴樹上的同一層,則誰在前選擇誰。
總之,避免傳遞依賴時引起版本問題出現的最佳實踐。一般情況下,如果工程直接依賴到某一框架的多個模塊,最好全部聲明這些依賴。