Maven解決jar包版本沖突的4種方法詳解
概念
先解釋下maven的依賴傳遞:a jar包引入了b jar包,如果項(xiàng)目中引入了a jar包,其實(shí)也會把a(bǔ)依賴的b jar包引入。那現(xiàn)在有a、c這2個(gè)jar包,a jar包依賴的是1.0.0版本的b jar包,c jar包也依賴了b jar包,版本是2.0.0;如果項(xiàng)目中引入了a、c jar包,那b jar包到底引入哪個(gè)版本呢,是1.0.0還是2.0.0?這就是版本沖突,有4種方法可以解決。
路徑近者優(yōu)先
比如a依賴b(版本是1.0.0),項(xiàng)目中引入a,同時(shí)直接引入了b(版本是2.0.0),這時(shí)前者版本路徑是不是長點(diǎn),看做是1,后者是0;所以項(xiàng)目引入的b jar包的版本也確定了,是2.0.0;如果a依賴b,b依賴了c(版本是1.0.0),d依賴了c(版本是2.0.0),項(xiàng)目中引入了a、d jar包,c jar包也會被引入,版本會是2.0.0(前者版本路徑是2,后者是1)。哪個(gè)版本的依賴路徑短,就是會引入這個(gè)版本的jar包。
第一聲明者優(yōu)先
如果a依賴了b(版本是1.0.0),c也依賴了b(版本是2.0.0);同時(shí)引入了a、c,這時(shí)b jar包的依賴路徑是一樣的了,就會用到這個(gè)原則:第一聲明者優(yōu)先。項(xiàng)目的pom.xml是這樣定義的:
<dependency>
<groupId>xx.xx.xx</groupId>
<artifactId>a</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>xx.xx.xx</groupId>
<artifactId>c</artifactId>
<version>1.0.0</version>
</dependency>a先聲明了,所以引入的b的版本也確定了:1.0.0;如果pom.xml中,這2個(gè)順序顛倒了,c放在前面了,引入的b的版本就會是2.0.0。
排除原則
同樣是a依賴了b(版本是1.0.0),c依賴了b(版本是2.0.0);就想要2.0.0版本的b,可以用排除原則:
<dependency>
<groupId>xx.xx.xx</groupId>
<artifactId>a</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>xx.xx.xx</groupId>
<artifactId>b</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xx.xx.xx</groupId>
<artifactId>c</artifactId>
<version>1.0.0</version>
</dependency>這時(shí)項(xiàng)目中引入a jar包時(shí),不會把依賴的1.0.0版本的b jar包給引入(因?yàn)閑xclusion標(biāo)簽把它排除了);但是引入c jar包時(shí),依賴的2.0.0版本的b jar包照舊引入,這時(shí)就不存在版本沖突了,因?yàn)榫鸵肓?個(gè)版本的b jar包,不是多個(gè)。所以項(xiàng)目是引入了2.0.0版本的b jar包。
版本鎖定
這個(gè)就更加硬霸,a依賴了b(版本是1.0.0),c依賴了b(版本是2.0.0),我想要引入的是1.0.0版本的b jar包或者是其余版本的(3.0.0),可以用版本鎖定:
<dependency>
<groupId>xx.xx.xx</groupId>
<artifactId>a</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>xx.xx.xx</groupId>
<artifactId>b</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xx.xx.xx</groupId>
<artifactId>c</artifactId>
<version>1.0.0</version>
</dependency>這時(shí)項(xiàng)目中引入的b jar包的版本就是3.0.0了,不是1.0.0或者是2.0.0,以dependencyManagement標(biāo)簽中定義的版本為準(zhǔn)。
總結(jié)
到此這篇關(guān)于Maven解決jar包版本沖突的4種方法的文章就介紹到這了,更多相關(guān)Maven解決jar包版本沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何基于sqlite實(shí)現(xiàn)kafka延時(shí)消息詳解
這篇文章主要給大家介紹了關(guān)于如何基于sqlite實(shí)現(xiàn)kafka延時(shí)消息的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
一文詳解SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的自動切換
在現(xiàn)代企業(yè)級應(yīng)用中,為了提高系統(tǒng)的可維護(hù)性和擴(kuò)展性,多數(shù)據(jù)源的配置和使用變得越來越常見,本文將,介紹如何在Spring Boot項(xiàng)目中實(shí)現(xiàn)多數(shù)據(jù)源的自動切換有需要的小伙伴可以了解下2025-10-10
spring boot 自動更新靜態(tài)文件和后臺代碼的實(shí)例
下面小編就為大家分享一篇spring boot 自動更新靜態(tài)文件和后臺代碼的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
java編程兩種樹形菜單結(jié)構(gòu)的轉(zhuǎn)換代碼
這篇文章主要介紹了java編程兩種樹形菜單結(jié)構(gòu)的轉(zhuǎn)換代碼,首先介紹了兩種樹形菜單結(jié)構(gòu)的代碼,然后展示了轉(zhuǎn)換器實(shí)例代碼,最后分享了相關(guān)實(shí)例及結(jié)果演示,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12
解決springboot整合cxf啟動報(bào)錯(cuò),原因是版本問題
這篇文章主要介紹了解決springboot整合cxf啟動報(bào)錯(cuò),原因是版本問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java基礎(chǔ)總結(jié)之Thymeleaf詳解
Thymeleaf是一種現(xiàn)代的基于服務(wù)器端的Java模板引擎技術(shù),也是一個(gè)優(yōu)秀的面向Java的XML、XHTML、HTML5頁面模板,它具有豐富的標(biāo)簽語言、函數(shù)和表達(dá)式,在使用Spring Boot框架進(jìn)行頁面設(shè)計(jì)時(shí),一般會選擇Thymeleaf模板,需要的朋友可以參考下2021-05-05

