在开发过程当中,编译期间发生的异常比较好确定,但是有些在代码运行期间出现的问题,有时候在我们开发过程中是无法预测的。如下:
java.lang.ClassNotFoundException
java.lang.NoSuchFieldException
java.lang.NoSuchMethodError
java.lang.NoClassDefFoundError
java.lang.LinkageError
...
遇到下面这些异常问题,我们应该如何定位问题及解决问题:
jar包版本冲突导致的问题:
Intellij Ctrl + N + N 查找文件的坐标,查找所需类所在的jar包版本
mvn dependency:tree -Dverbose -Dincludes=org.springframework:spring-core
mvn dependency:tree -Dincludes=org.springframework:spring-core
优先按照依赖管理<dependencyManagement>元素中指定的版本声明进行仲裁,此时下面的两个原则都无效了
若无版本声明,则按照“短路径优先”的原则(Maven2.0)进行仲裁,即选择依赖树中路径最短的版本
若路径长度一致,则按照“第一声明优先”的原则进行仲裁,即选择POM中最先声明的版本
如果还是有问题就看,打包方式,及MANIFAST.MF文件中Class-Path中是否声明了该jar包
如果声明了该jar包路径,
但如果还是还是提示ClassNotFoundException等运行异常则采用System.getproperty("java.classpath") , 打印出运行环境中的jar包加载顺序(依赖加载顺序靠前的jar包)
如果多个不同的jar包中都包含相同的类(Package+FileName)冲突导致的问题
D:\workspace\quartz_dir\netty\target>java -cp netty-1.0-SNAPSHOT.jar -verbose:class com.phei.netty.DoJavaMain > D:\abcd.txt
返回结果中可以查找到类加载的是哪个jar包下的,然后解决Jar包加载顺序