Maven依賴沖突的解決方式
對Maven概念還不了解的可以看看我的這篇文章: https://blog.csdn.net/pjh88/article/details/108520721
在講依賴沖突之前我們先來講講什么是依賴傳遞
在maven中依賴是可以傳遞的,比如我們有A,B,C三個項目,其中A依賴B,B依賴C,由遞推可知A依賴C
舉例
比如我們在web項目中導入spring-webmvc的jar包,即我們的項目依賴了spring-webmvc,其實spring-webmvc還依賴其他jar包,比如sping-aop、spring-beans,所以我們的web項目也間接依賴了sping-aop、spring-beans
什么是依賴沖突
這是由於依賴傳遞現象的存在
比如spring-webmvc 依賴 spirng-beans-4.2.4,而spring-aop 依賴 spring-beans-5.0.2,但是發現 spirng-beans-4.2.4 加入到了工程中,而我們希望 spring-beans-5.0.2 加入工程。這就造成了依賴沖突。
在我們的開發中我們當然啦不允許這種情況的出現,我們要使用什么版本,他就必須使用什么版本
解決方案
- 使用maven提供的依賴調解原則
第一聲明者優先原則
路徑近者優先原則 - 排除依賴
- 鎖定版本
1. 使用maven提供的依賴調解原則
第一聲明者優先原則
在 pom 文件中定義依賴,以先聲明的依賴為准。其實就是根據坐標導入的順序來確定最終使用哪個傳遞過來的依賴。
通過上圖可以看到,spring-aop和spring-webmvc都傳遞過來了spring-beans,但是因為spring-aop在前面,所以最終使用的spring-beans是由spring-aop傳遞過來的,而spring-webmvc傳遞過來的spring-beans則被忽略了
路徑近者優先原則
在 pom 文件定義依賴,以路徑近者為准。
還是上述情況,spring-aop 和 spring-webmvc 都會傳遞過來 spirng-beans,那如果直接把 spring-beans 的依賴直接寫到 pom 文件中,那么項目就不會再使用其他依賴傳遞來的 spring-beans,因為自己直接在 pom 中定義 spring-beans要比其他依賴傳遞過來的路徑要近
排除依賴
可以使用exclusions標簽將傳遞過來的依賴排除出去
沒有使用的時候
使用之后
通過上圖可以看到,spring-webmvc傳遞過來的4.2.4版本的spring-beans已經被排除出去了,項目中使用的為spring-aop傳遞過來的5.0.2版本的spring-beans。
版本鎖定
使用dependencyManagement標簽鎖定依賴的版本
注意dependencyManagement中指定的僅僅是對應jar包的版本,並不會把指定的jar導入到項目中,要導入對應的jar包還是要使用dependencies標簽
在使用dependence標簽的時候不需要再指定版本號了