1、首先要明白直接依賴和傳遞依賴的概念:html
A > B > Cjava
直接依賴:A > B , B > Cspring
傳遞依賴:A > Capi
2、衝突產生的緣由:spring-jdbc和context同時依賴於spring-beans,若是jdbc和context的版本不一致,那相應的spring-beans版本便也不一致,此時應該依賴哪一版本的spring-beans呢,這便產生了依賴衝突。tomcat
3、衝突的解決方案:jsp
一、Maven本身調解原則:maven
(1)第一聲明者優先原則(誰先定義就用誰的傳遞依賴)ide
(2)路徑近者優先原則(直接依賴級別高於傳遞依賴)工具
二、排除依賴:單元測試
在pom.xml中將衝突的依賴排除
(也可在dependencies查看中將spring-beans jar包右鍵選擇exclution Maven artifct)
三、版本鎖定(推薦使用):
還能夠將版本屬性統一配置:
4、使用IntelliJ IDEA工具
使用IDEA原生的jar包衝突解決可參考:詳述使用 IntelliJ IDEA 解決 jar 包衝突的問題
使用Maven Helper插件:idea 中解決maven 包衝突的問題(maven helper)(相對原生工具更好用)
如下爲摘錄內容:(原貼:https://www.oschina.net/question/698806_159139,https://www.cnblogs.com/wangyonghao/p/5976055.html)
在Maven的依賴管理中,常常會用到依賴的scope設置。
Scope的使用場景和說明
1.compile
編譯範圍,默認scope,在工程環境的classpath(編譯環境)和打包(若是是WAR包,會包含在WAR包中)時候都有效。
2.provided
容器或JDK已提供範圍,表示該依賴包已經由目標容器(如tomcat)和JDK提供,只在編譯的classpath中加載和使用,打包的時候不會包含在目標包中。最多見的是j2ee規範相關的servlet-api和jsp-api等jar包,通常由servlet容器提供,無需在打包到war包中,若是不配置爲provided,把這些包打包到工程war包中,在tomcat6以上版本會出現衝突沒法正常運行程序(版本不符的狀況)。
3.runtime
通常是運行和測試環境使用,編譯時候不用加入classpath,打包時候會打包到目標包中。通常是經過動態加載或接口反射加載的狀況比較多。也就是說程序只使用了接口,具體的時候可能有多個,運行時經過配置文件或jar包掃描動態加載的狀況。典型的包括:JDBC驅動等。
4.test
測試範圍,通常是單元測試場景使用,在編譯環境加入classpath,但打包時不會加入,如junit等。
5.system 系統範圍,與provided相似,只是標記爲該scope的依賴包須要明確指定基於文件系統的jar包路徑。由於須要經過systemPath指定本地jar文件路徑,因此該scope是不推薦的。若是是基於組織的,通常會創建本地鏡像,會把本地的或組織的基礎組件加入本地鏡像管理,避過使用該scope的狀況。 實踐: • provided是沒有傳遞性的,也就是說,若是你依賴的某個jar包,它的某個jar的範圍是provided,那麼該jar不會在你的工程中依靠jar依賴傳遞加入到你的工程中。 • provided具備繼承性,上面的狀況,若是須要統一配置一個組織的通用的provided依賴,可使用parent,而後在全部工程中繼承。