對Maven概念還不瞭解的能夠看看個人這篇文章: https://blog.csdn.net/pjh88/article/details/108520721java
在maven中依賴是能夠傳遞的,好比咱們有A,B,C三個項目,其中A依賴B,B依賴C,由遞推可知A依賴Cweb
好比咱們在web項目中導入spring-webmvc的jar包,即咱們的項目依賴了spring-webmvc,其實spring-webmvc還依賴其餘jar包,好比sping-aop、spring-beans,因此咱們的web項目也間接依賴了sping-aop、spring-beans算法
這是因爲依賴傳遞現象的存在spring
好比spring-webmvc 依賴 spirng-beans-4.2.4,而spring-aop 依賴 spring-beans-5.0.2,可是發現 spirng-beans-4.2.4 加入到了工程中,而咱們但願 spring-beans-5.0.2 加入工程。這就形成了依賴衝突。網絡
在咱們的開發中咱們固然啦不容許這種狀況的出現,咱們要使用什麼版本,他就必須使用什麼版本數據結構
第一聲明者優先原則mvc
在 pom 文件中定義依賴,以先聲明的依賴爲準。其實就是根據座標導入的順序來肯定最終使用哪一個傳遞過來的依賴。maven
經過上圖能夠看到,spring-aop和spring-webmvc都傳遞過來了spring-beans,可是由於spring-aop在前面,因此最終使用的spring-beans是由spring-aop傳遞過來的,而spring-webmvc傳遞過來的spring-beans則被忽略了操作系統
路徑近者優先原則.net
在 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標籤的時候不須要再指定版本號了