大家好,我是IT修真院北京分院第22期的學(xué)員童志榮,一枚正直純潔善良的java程序員。
一宦言、背景介紹
如果 Maven 的依賴構(gòu)建必須每一個項目都指定,那配置是累死人了商模,比如A依賴了20個項目奠旺,B依賴A,那么還要添加20個項目,那就悲劇了阻桅,所以 maven有依賴傳遞的功能凉倚。
二、知識剖析
Maven采用“最近獲勝策略(nearest wins strategy)”的方式處理依賴沖突嫂沉。
換句話說稽寒,如果一個項目依賴于相同artifact的多個版本,在依賴樹中離項目最近的那個版本將被使用趟章。
三杏糙、常見問題
現(xiàn)在有一個web應(yīng)用resolve-web。
4個jar包:project-A蚓土,project-B宏侍,project-C,project-Common
resolve-web 依賴于project-A和project-B蜀漆,
project-A依賴于project-common的1.0版本谅河,調(diào)用了其中的sayHello()方法。
project-B依賴于project-C确丢,而project-C又進一步依賴于project-common的2.0版本绷耍,并調(diào)用其中的sayGoodBye()方法。
project-common的1.0和2.0版本唯一區(qū)別在于鲜侥,1.0中包含sayHello()方法褂始,而2.0中包含了sayHello()和sayGoodBye()兩個方法。
根據(jù)Maven的依賴傳遞機制描函,resolve-web將同時依賴于project-common的1.0和2.0版本崎苗,這就造成了依賴沖突狐粱。
而根據(jù)最近獲勝策略,Maven將選擇project-common的1.0版本作為最終的依賴胆数。
對于Maven 來說肌蜻,由于proejct-common的1.0版本比2.0版本在依賴樹中離resolve-web更近,故1.0版本獲勝幅慌。
在resolve-web中執(zhí)行"mvn dependency:tree -Dverbose"可以看到resolve-web的依賴關(guān)系:
可以看到宋欺,project-common:project-commmon:jar:2.0被忽略掉了。
此時在resolve-web的war包中將只包含project-common的1.0版本胰伍。
所以現(xiàn)在就產(chǎn)生問題了齿诞。由于project-common的1.0版本中不包含sayGoodBye()方法,而該方法正是project-C所需要的骂租,所以運行時將出現(xiàn)“NoSuchMethodError”祷杈。
四、解決方案
方法1:顯式加入對project-common 2.0版本的依賴渗饮。
先前的2.0版本不是離resolve-web遠了點嗎但汞,那我們就直接將它作為resolve-web的依賴,這不就比1.0版本離resolve-web還近嗎互站?
在resove-web的pom.xml文件中直接加上對project-common 2.0 的依賴:
方法2:resolve-web對project-A的dependency聲明中私蕾,將project-common排除掉。在resolve-web的pom.xml文件中修改對project-A的dependency聲明:
五胡桃、編碼實戰(zhàn)
六踩叭、擴展思考
七、參考文獻
http://www.cnblogs.com/davenkin/p/advanced-maven-resolve-dependencies-conflicts.html
八翠胰、更多討論