依賴傳遞
參見:Maven依賴機制簡介
總結(jié):
一句話概括:當(dāng)項目A依賴于B扩所,而B又依賴于C的時候辙纬,自然的A會依賴于C挣惰,這樣Maven在建立項目A的時候农曲,會自動加載對C的依賴
依賴沖突
總結(jié):
既然依賴可以傳遞,那么工程就能獲取到依賴的所有版本厉斟。當(dāng)傳遞的依賴有多個版本時挚躯,就產(chǎn)生了沖突
依賴選取
總結(jié):
沖突是客觀存在的,需要有策略能解決沖突擦秽。
Maven依賴選取原則
- 最短路徑
- 最先聲明
最短路徑
依賴e
的版本為1.2版本
最先聲明
如果在工程A中码荔,先聲明對依賴b
的依賴,由于依賴b
依賴d的1.1版本感挥,因此工程A會依賴d的1.1版本
沖突分析
不解決沖突缩搅,可能會出現(xiàn)ClassNotFoundException
或NoSuchMethodException
。如下所示:
分析方法
參見Maven提高篇系列之(五)——處理依賴沖突
Maven類包沖突終極解決小技若干
總結(jié)為:
使用
dependency:tree
分析依賴使用
mvn dependency:tree -Dverbose
查看更多信息触幼,尤其conflict不想被其他信息干擾硼瓣,添加
Dincludes
或者Dexcludes
來排除干擾,如下只顯示asm:asm
相關(guān)的信息:mvn dependency:tree -Dverbose -Dincludes=asm:asm
- mvn dependency:analyze?
如上圖所示置谦,curator-framework
依賴curator-client
的版本是2.12.0堂鲤。但是根據(jù)依賴選取規(guī)則,選取的curator-client
版本是2.7.1霉祸。這樣curator-framework
只能降級筑累,使用2.7.1版本的curator-client
。如果使用了只有在2.12.0中存在的方法丝蹭,那么就會報錯慢宗。
絕大多數(shù)情況下,高版本都會兼容低版本奔穿。因此镜沽,使maven選取高版本的依賴,是比較好的做法贱田。
解決沖突
參見:Maven 依賴管理
總結(jié)
- 縮短指定版本的路徑
- exclude掉不想要的版本
- 將依賴聲明為optional
根據(jù)依賴選取策略缅茉,snappy-java
的1.1.4
版本會被選取。這個明顯高于其他的1.1.1.6和1.1.2.6版本男摧。一般情況下蔬墩,高版本會兼容低版本,因此這種情況通常不會出問題耗拓。