maven定義了許多dependency,每一個dependency內部也會定義它的dependency。web
1.0
),B <- C(1.1
)。1.1
)來導入(這個選擇maven會根據不等路徑短路徑原則和同等路徑第一聲明原則選取),C(1.0
)中的類c在C(1.1
)中被修改而不存在了。1.0
)之前有可是升級到C(1.1
)就缺失的類c,致使運行期失敗,出現很典型的依賴衝突時的NoClassDefFoundError
錯誤。NoSuchMethodError
錯誤。mvn dependency:tree
,或者使用IDEA的插件Dependency Analyzer插件來可視化地分析依賴關係。這個過程後能夠明確哪些dependency引入了可能會衝突的依賴。1.1
版本,引入的B會在內部依賴C的1.0版本,那麼Dependency Analyzer插件會出現依賴衝突提示,會提示B引入的C的1.0版本和當前選用的C的1.1
版本衝突於是被忽略(1.0 omitted for conflict with 1.1)。NoClassDefFoundError
或NoSuchMethodError
,致使編譯期正常的代碼沒法在運行期跑起來。1.1
版本,好比B是一個許久未升級的舊項目,那麼也能夠考慮把A的版本拉低以使得C的版本降到與B一致的1.0
版本,固然這也可能會反過來致使A不能正常工做。1.1
版本中仍然沒有改變的類或方法,那麼能夠考慮直接使用舊的1.0
版本,那麼可使用exclusion
標籤來在A中排除掉對C的依賴,那麼A在使用到C的功能時會使用B引入的1.0
舊版本C。即A其實向B妥協使用了B依賴的C。來看個實例:spring
4.2.5.RELEASE
的spring-webmvc
,同時引入了3.2.1.RELEASE
的spring-security-web
。4.2.5.RELEASE
引入呢,其實前文提到過:好比對spring-beans
這個依賴來講spring-webmvc:4.2.5.RELEASE
-spring-beans:4.2.5.RELEASE
的路徑是2,而spring-security-web:3.2.1.RELEASE
-spring-security-core:3.2.1.RELEASE
-spring-beans:3.2.8.RELEASE
的路徑是3,所以根據不等路徑取短路徑原則則選取了前者,即spring-beans:4.2.5.RELEASE
,注意的是引入時並非優先引入高版本的,同時若是依賴的路徑長相等則取第一個出現的版本。spring-security-web
引入的一衆spring依賴是3.X版本的,同spring-webmvc
的4.2.5.RELEASE
版本不一致。spring-webmvc
的4.2.5.RELEASE
的情形下尋找spring依賴版本一致的spring-security-web
,在www.mvnrepository.com尋找合適版本依賴的spring-security-web
,最終咱們看到了4.1.0.RELEASE
版本彷佛還不錯,其依賴的spring版本在4.2.5.RELEASE
:spring-security-web
填入pom.xml看一下效果,確實已經沒有依賴衝突產生了:4.2.5.RELEASE
的spring-security-web
怎麼辦,好比全部的spring-security-web
版本就是在4.2.3.RELEASE
或者4.2.6.RELEASE
,那麼咱們就得想到妥協一下了:使用4.1.1.RELEASE
版本的spring-security-web
,它的spring依賴版本是4.3.1.RELEASE
,那麼咱們試圖使用exclusive
標籤來忽略spring版本:express
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>4.1.1.RELEASE</version> <exclusions> <exclusion> <artifactId>spring-aop</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-context</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-expression</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-web</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency>
依賴衝突會消失,spring-security-web
會使用4.2.5.RELEASE
版本的spring:mvc