什么是Maven的依賴沖突呢唆缴?
舉個例子,假如A和B都依賴了一個C涯呻,但這個C是不同版本的凉驻。這時,D又要依賴A和B复罐,那么C就是D的傳遞依賴了涝登。但是因為C有兩個不同的版本,不知道該選哪個市栗,D表示很苦惱缀拭。——這就是依賴沖突了填帽。
遇到依賴沖突蛛淋,我們有兩條原則:
一、 短路優(yōu)先(優(yōu)先解析傳遞路徑短的版本)篡腌。
例如:
第一條依賴路徑:A → B → C → X(jar)
第二條依賴路徑:A → D →X(jar)
因為第二條依賴路徑相對來說最短褐荷,所以A會依賴第二條路徑X的版本。
為了更加清楚的解釋這一點嘹悼,接下來我會在Eclipse中做實驗:
- 首先打開百寶箱叛甫,找到【commons-io】,如圖:
- 點擊紅框的Item杨伙,進(jìn)入詳情:
好多版本啊其监,既然我們要實驗版本沖突,那么我這次就使用2.5和1.4吧~
2.5版本的依賴:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
1.4版本的依賴:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
到此呢限匣,先不要急著往下走抖苦,現(xiàn)在回想一下上篇的內(nèi)容,想不起來戳→Maven傳遞依賴
上篇我們講:A依賴B ,B依賴C锌历,那么A和C時傳遞依賴關(guān)系贮庞。
現(xiàn)在我們增加一點復(fù)雜性,以完成依賴沖突這個課題【课鳎現(xiàn)在讓C依賴【commons-io的1.4版本】窗慎,讓B依賴【commons-io的2.5版本】,看A最終會依賴哪個版本呢卤材?
如上所述遮斥,短路優(yōu)先這個原則是正確的。
二商膊、 先聲明先優(yōu)先(如果依賴路徑長度相同伏伐,則誰先聲明,先解析誰)晕拆。
為了驗證這個結(jié)論,還需要再次更改我們項目〔牡牛現(xiàn)在我們改成:A同時直接依賴B和C实幕。
A的pom.xml內(nèi)容,注意順序哦堤器,C在B前邊聲明:
<dependency>
<groupId>com.amber.maventest</groupId>
<artifactId>maventest-c</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.amber.maventest</groupId>
<artifactId>maventest-b</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
以后遇到此類問題昆庇,就知道為什么了吧~