PPT鏈接:https://ptteng.github.io/PPT/PPT/mavenConflicts.html#/
視頻鏈接:https://v.qq.com/x/page/v0520nb0tts.html
大家好雀扶,我是IT修真院北京分院第22期的學(xué)員童志榮灶似,一枚正直純潔善良的java程序員睬魂。
今天給大家分享一下幻林,修真院官網(wǎng)Java任務(wù)4贞盯,深度思考中的知識(shí)點(diǎn)————如何處理 maven 依賴沖突?
一沪饺、背景介紹
Java的強(qiáng)大之處就是在于它的生態(tài)環(huán)境躏敢,有眾多的第三方服務(wù)支持復(fù)雜項(xiàng)目的開發(fā)≌希基本上每個(gè)稍微有點(diǎn)規(guī)模的Java項(xiàng)目都會(huì)依賴到眾多的jar包件余,而Maven應(yīng)該是目前管理jar包依賴最流行的工具。
二遭居、知識(shí)剖析
Maven采用“最近獲勝策略(nearest wins strategy)”的方式處理依賴沖突啼器。換句話說,如果一個(gè)項(xiàng)目依賴于相同artifact的多個(gè)版本魏滚,在“依賴樹”中離項(xiàng)目最近的那個(gè)版本將被使用镀首。
三、常見問題
現(xiàn)在有一個(gè)web應(yīng)用resolve-web鼠次。
4個(gè)jar包:project-A更哄,project-B,project-C腥寇,project-Common成翩。
首先,我們針對(duì)只有sayHello()的 project-common赦役,設(shè)置其版本為1.0麻敌,并執(zhí)行mvn install。然后對(duì)其添加 sayGoodBye 方法掂摔,更改版本為2.0术羔,執(zhí)行mvn install赢赊。
現(xiàn)在,本地倉庫同時(shí)有了project-common 1.0和2.0的jar包级历。它們將分別被project-C 和 project-A 所依賴释移。
resolve-web 依賴于project-A和project-B,
project-A依賴于project-common1.0的jar包寥殖,調(diào)用了其中的sayHello()方法玩讳。
package project.common;
//project-common的1.0版本
public class HelloWorld {
public String sayHello() {
return "hello world";
}
}
package projectA;
import project.common.HelloWorld;
public class HelloService {
private HelloWorld helloWorld;
public HelloService(HelloWorld helloWorld) {
this.helloWorld = helloWorld;
}
public String sayHello() {
return helloWorld.sayHello();
}
}
project-B依賴于project-C,而project-C又進(jìn)一步依賴于project-common2.0的jar包嚼贡,并調(diào)用其中的sayGoodBye()方法熏纯。
package project.common;
public class HelloWorld {
//project-common的1.0版本
public String sayHello() {
return "hello world";
}
public String sayGoodBye(){
return "Good Bye";
}
}
project-common的1.0和2.0版本唯一區(qū)別在于,1.0中包含sayHello()方法粤策,而2.0中包含了sayHello()和sayGoodBye()兩個(gè)方法樟澜。
根據(jù)maven的依賴傳遞機(jī)制,雖然 resolve-web 并未直接引用project-common掐场,但 B 依賴的 C 依賴了 common往扔,所以 web 項(xiàng)目最終依賴了 common 。同理熊户,web 項(xiàng)目也經(jīng)由 A 依賴了 common。
C 的 pom.xml 中:
<dependency>
<groupId>project-common</groupId>
<artifactId>project-commmon</artifactId>
<version>2.0</version>
</dependency>
A 的 pom.xml中:
<dependency>
<groupId>project-common</groupId>
<artifactId>project-commmon</artifactId>
<version>2.0</version>
</dependency>
現(xiàn)在整個(gè)項(xiàng)目的依賴圖呈現(xiàn)這樣的效果:
或者吭服,在 resolve-web 目錄下執(zhí)行 “mvn dependency:tree -Dverbose”
也就是表明嚷堡,project-C 雖然在 pom 中指明了其依賴的是 project-common-2.0,但根據(jù)maven的“近者優(yōu)勝”策略艇棕,實(shí)質(zhì)上它引用的是1.0蝌戒。
所以這會(huì)造成什么后果呢?
讓我們啟動(dòng) resolve-web 項(xiàng)目沼琉,并訪問它的兩個(gè)servlet北苟,它們分別調(diào)用了 1.0和2.0 共有的sayHello() 方法 和2.0特有的sayGoodBye()方法。
在訪問goodbye路徑時(shí)報(bào)了錯(cuò):
對(duì)于這種有依賴沖突所導(dǎo)致的問題打瘪,我們有兩種解決方法友鼻。
方法1:
顯式加入對(duì)project-common 2.0版本的依賴。
先前的2.0版本不是離resolve-web遠(yuǎn)了點(diǎn)嗎闺骚,那我們就直接將它作為resolve-web的依賴彩扔,這不就比1.0版本離resolve-web還近嗎?
在resove-web的pom.xml文件中直接加上對(duì)project-common 2.0 的依賴就好了僻爽。
方法2:
resolve-web對(duì)project-A的dependency聲明中虫碉,將project-common排除掉。在resolve-web的pom.xml文件中修改對(duì)project-A的dependency聲明:
方法2是不是有一點(diǎn)巧妙呢胸梆?雖然project-common被排除在project-A的dependency聲明中了敦捧,但 project-A 自身的 pom 文件中依然存在對(duì) project-common 1.0 的依賴须板。導(dǎo)致了 maven 最終會(huì)將2.0作為project-c的依賴。
今天的分享就到這里啦兢卵,歡迎大家點(diǎn)贊习瑰、轉(zhuǎn)發(fā)、留言济蝉、拍磚~
技能樹.IT修真院“我們相信人人都可以成為一個(gè)工程師杰刽,現(xiàn)在開始,找個(gè)師兄王滤,帶你入門贺嫂,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷醚阆纾”第喳。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線踱稍,學(xué)習(xí)透明化曲饱,成長(zhǎng)可見化,師兄1對(duì)1免費(fèi)指導(dǎo)珠月±┑恚快來與我一起學(xué)習(xí)吧~我的邀請(qǐng)碼:11081435,或者你可以直接點(diǎn)擊此鏈接:http://www.jnshu.com/login/1/11081435