特徵:NoSuchMethodException/ClassNotFoundException/NoClassDefFoundError/ClassCastExceptionjava
排查:web
1)查看jar包的版本:-XX:+TraceClassLoading 或 -verbose:class 2)找到衝突的jar包: 1>idea中Maven Projects視圖下,點擊工具欄的第9個圖標(show dependencies),稍等片刻就會出現一張顯示jar包依賴關係的圖。 2>紅色的實線表示有衝突(右鍵Exclude便可解決衝突),紅色的虛線表示同一個jar被屢次引用的地方。
解決:apache
1)在pom中去除不須要的版本<scope>provided</scope>,在打包階段就儘量避免掉版本衝突的問題。 2)若是衝突發生了,則Exclude衝突的jar包便可。
舉例:tomcat
問題:Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: com.google.common.base.Splitter.splitToList(Ljava/lang/CharSequence;)Ljava/util/List; 排查: -XX:+TraceClassLoading 或 -verbose:class 排查結果:[Loaded com.google.common.base.Splitter from file:/E:/Tomcat/apache-tomcat-8.0.33/webapps/advertise-management-control/WEB-INF/lib/guava-11.0.2.jar] 在/apache-tomcat-8.0.33/webapps/ROOT/WEB-INF/lib/下發現有兩個guava的jar包:guava-11.0.2.jar 和 guava-19.0.jar 解決: 經過idea的show dependencies功能,發現有兩個依賴分別引用了guava-11和guava-19,splitToList這個方法是guava-19提供的方法,故咱們在引用guava-11的依賴中將guava Exclude後即解決了問題。
補充:app
idea中Maven Projects視圖下: 1)點擊工具欄的第9個圖標(show dependencies),稍等片刻就會出現一張顯示jar包依賴關係的圖。 2)紅色的實線表示有衝突(右鍵Exclude便可解決衝突),紅色的虛線表示同一個jar被屢次引用的地方。 注意: 1>Exclude衝突的jar包後,須要手動到tomcat的webapps目錄下將工程刪掉,而後從新部署。不然的話,\webapps\project-name\WEB-INF\lib下極可能還存在(以前下載的)衝突的jar包。 2>使用mvn dependency:tree 查看jar包之間的依賴關係不太靠譜,故推薦使用idea提供的功能。