Maven解決jar包版本沖突的4種方法詳解
概念
先解釋下maven的依賴傳遞:a jar包引入了b jar包,如果項目中引入了a jar包,其實也會把a依賴的b jar包引入。那現(xiàn)在有a、c這2個jar包,a jar包依賴的是1.0.0版本的b jar包,c jar包也依賴了b jar包,版本是2.0.0;如果項目中引入了a、c jar包,那b jar包到底引入哪個版本呢,是1.0.0還是2.0.0?這就是版本沖突,有4種方法可以解決。
路徑近者優(yōu)先
比如a依賴b(版本是1.0.0),項目中引入a,同時直接引入了b(版本是2.0.0),這時前者版本路徑是不是長點,看做是1,后者是0;所以項目引入的b jar包的版本也確定了,是2.0.0;如果a依賴b,b依賴了c(版本是1.0.0),d依賴了c(版本是2.0.0),項目中引入了a、d jar包,c jar包也會被引入,版本會是2.0.0(前者版本路徑是2,后者是1)。哪個版本的依賴路徑短,就是會引入這個版本的jar包。
第一聲明者優(yōu)先
如果a依賴了b(版本是1.0.0),c也依賴了b(版本是2.0.0);同時引入了a、c,這時b jar包的依賴路徑是一樣的了,就會用到這個原則:第一聲明者優(yōu)先。項目的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個順序顛倒了,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>
這時項目中引入a jar包時,不會把依賴的1.0.0版本的b jar包給引入(因為exclusion標簽把它排除了);但是引入c jar包時,依賴的2.0.0版本的b jar包照舊引入,這時就不存在版本沖突了,因為就引入了1個版本的b jar包,不是多個。所以項目是引入了2.0.0版本的b jar包。
版本鎖定
這個就更加硬霸,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>
這時項目中引入的b jar包的版本就是3.0.0了,不是1.0.0或者是2.0.0,以dependencyManagement標簽中定義的版本為準。
總結(jié)
到此這篇關(guān)于Maven解決jar包版本沖突的4種方法的文章就介紹到這了,更多相關(guān)Maven解決jar包版本沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合xxl-job實現(xiàn)分布式定時任務(wù)的過程
XXL-JOB是一個分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴展,這篇文章主要介紹了springboot整合xxl-job分布式定時任務(wù),需要的朋友可以參考下2022-08-08詳解微信開發(fā)之Author網(wǎng)頁授權(quán)
微信開發(fā)中,經(jīng)常有這樣的需求:獲得用戶頭像、綁定微信號給用戶發(fā)信息,那么實現(xiàn)這些的前提就是授權(quán)!本文對此進行系統(tǒng)介紹,需要的朋友一起來看下吧2016-12-12Java日志相關(guān)技術(shù)_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java日志相關(guān)技術(shù)_動力節(jié)點Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-07-07SpringBoot集成Redis并實現(xiàn)主從架構(gòu)的實踐
本文主要和大家分享一下在springboot中如何集成redis,并實現(xiàn)主從架構(gòu),進行數(shù)據(jù)的簡單存儲,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12