jar 包沖突原因
Caused by:java.lang.NoSuchMethodError
Caused by: java.lang.ClassNotFoundException
大概就是jar包沖突(今天遇到的是第一種)
依賴傳遞
A依賴
-> B
D依賴
-> A
-> B
因?yàn)镸aven擁有傳遞依賴的特性陕悬,因此真實(shí)的依賴樹(shù)是:
A依賴
-> B
D依賴
-> A
-> B
-> B
依賴傳遞問(wèn)題:
- 當(dāng)依賴層級(jí)很深的時(shí)候,可能造成循環(huán)依賴(cyclic dependency)
- 當(dāng)依賴的數(shù)量很多的時(shí)候,依賴樹(shù)會(huì)非常大
查找依賴沖突
idea插件 dependency analyzer插件赤嚼,如下圖,可以清晰的看到依賴樹(shù)搁进,進(jìn)而決定如何解決
image.png
maven提供的解決方法:
依賴調(diào)節(jié)--就近原則
例如:
A項(xiàng)目通過(guò)依賴傳遞依賴了兩個(gè)版本的D:
A -> B -> C -> ( D 2.0) , A -> E -> (D 1.0)
那么最終A依賴的D的version將會(huì)是1.0,因?yàn)?.0對(duì)應(yīng)的層級(jí)更少昔头,也就是更近饼问。
依賴管理
Dependency management,可以大大簡(jiǎn)化子POM的依賴聲明揭斧。
即父pom.xml聲明版本莱革,子pom.xml
不用指定版本號(hào)。
- 依賴范圍(Dependency scope)
<scope>system</scope>
有以下參數(shù)
- compile: 編譯依賴范圍(默認(rèn))
- test: 測(cè)試依賴范圍 典型例子是JUnit讹开,它只有在編譯測(cè)試代碼及運(yùn)行測(cè)試的時(shí)候才需要
- provided: 已提供依賴范圍
使用此依賴范圍的Maven依賴盅视,對(duì)于編譯和測(cè)試classpath有效,但在運(yùn)行時(shí)無(wú)效旦万。
典型例子是servlet-api闹击,編譯和測(cè)試項(xiàng)目的時(shí)候需要該依賴,但在運(yùn)行項(xiàng)目的時(shí)候成艘,由于容器已經(jīng)提供赏半,就不需要Maven重復(fù)地引入一遍。 - runtime: 運(yùn)行時(shí)依賴范圍淆两。
使用此依賴范圍的Maven依賴除破,對(duì)于測(cè)試和運(yùn)行classpath有效,但在編譯主代碼時(shí)無(wú)效琼腔。
典型例子是JDBC驅(qū)動(dòng)實(shí)現(xiàn)瑰枫,項(xiàng)目主代碼的編譯只需要JDK提供的JDBC接口,只有在執(zhí)行測(cè)試或者運(yùn)行項(xiàng)目的時(shí)候才需要實(shí)現(xiàn)上述接口的具體JDBC驅(qū)動(dòng)丹莲。
排除依賴(Excluded dependencies)
排除不需要從所依賴的項(xiàng)目中傳遞過(guò)來(lái)的依賴 <exclude/>
可選依賴(Optional dependencies)
被依賴的項(xiàng)目主動(dòng)不把可以傳遞的依賴傳遞下去
解決方法
使用Maven提供的Optional和Exclusions來(lái)控制依賴的傳遞
Optional 定義后光坝,該依賴只能在本項(xiàng)目中傳遞,不會(huì)傳遞到引用該項(xiàng)目的父項(xiàng)目中甥材,父項(xiàng)目需要主動(dòng)引用該依賴才行盯另。
A
-> B
D
-> A
-> B
A/pom.xml如下:
<dependency>
<groupId>com.zxa</groupId>
<artifactId>B</artifactId>
<version>1.0</version>
<optional>true</optional>
</dependency>
這種情況下,此項(xiàng)目對(duì)B的依賴將不會(huì)傳遞給D
Exclusions 則是主動(dòng)排除子項(xiàng)目傳遞過(guò)來(lái)的依賴洲赵。
<dependency>
<groupId>com.bar</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.bar</groupId>
<artifactId>B</artifactId>
</exclusion>
</exclusions>
</dependency>
A