如何解决NoClassDefFoundError--第二部分
第一部分请看:http://vipcowrie./blog/1561291 本文面向的是JAVA初学者,建议你们自己编译和运行例子程序。 本文包含了NoClassDefFoundError的原因分析和例子程序,并且给出了建议的处理策略。 NoClassDefFoundError 问题原因1:缺少jar包 首先最常见的原因是classpath的配置问题。例子程序: 本例子程序尝试创建一个新的CallerClassA实例,然后执行他的一个方法,此方法引用了类ReferencingClassA,本例子演示了classpath问题导致的NoClassDefFoundError ,本例子还打印了当前的classloader chain的情况,以便进一步的分析。这个打印信息对你以后分析此类问题也很有帮助的: 程序 Java代码
Java代码
Java代码
打印classloader工具类: Java代码
正常运行: Java代码
异常重现: Java代码
发生了什么?当你在classpath中不包含guava的引用的时候,由于ReferencingClassA在运行期引用了此类,导致了classloader报告找不到此类,从而出现NoClassDefFoundError。 classloader分析 注意: Java代码
sun.misc.Launcher$AppClassLoader是系统的classloader,负责根据classpath设置在启动的时候加载应用需要的class。 sun.misc.Launcher$ExtClassLoader是扩展classloader,负责从java_home/lib/etc以及其他使用java.ext.dirs配置的目录从加载扩展java class。 从打印结果可以看出,sun.misc.Launcher$ExtClassLoader是系统classloader的实际父类。 建议处理策略 分析异常堆栈,找到缺少的java类名称,在classpath中验证,确保编译和运行期都能找到此类。 |
|