特征: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提供的功能。