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é)
到此這篇關于Maven解決jar包版本沖突的4種方法的文章就介紹到這了,更多相關Maven解決jar包版本沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
一文詳解SpringBoot實現(xiàn)多數(shù)據(jù)源的自動切換
在現(xiàn)代企業(yè)級應用中,為了提高系統(tǒng)的可維護性和擴展性,多數(shù)據(jù)源的配置和使用變得越來越常見,本文將,介紹如何在Spring Boot項目中實現(xiàn)多數(shù)據(jù)源的自動切換有需要的小伙伴可以了解下2025-10-10
spring boot 自動更新靜態(tài)文件和后臺代碼的實例
下面小編就為大家分享一篇spring boot 自動更新靜態(tài)文件和后臺代碼的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
java編程兩種樹形菜單結(jié)構(gòu)的轉(zhuǎn)換代碼
這篇文章主要介紹了java編程兩種樹形菜單結(jié)構(gòu)的轉(zhuǎn)換代碼,首先介紹了兩種樹形菜單結(jié)構(gòu)的代碼,然后展示了轉(zhuǎn)換器實例代碼,最后分享了相關實例及結(jié)果演示,具有一定借鑒價值,需要的朋友可以了解下。2017-12-12

