什么是NoClassDefFoundError?
与ClassNotFoundException异常不同,虽然NoClassDefFoundError也可能是找不到目标类,但其也可能是再初始化加载目标类时出错了,这两种情况均会导致jvm抛出这个错误。
这是一个运行时错误,而ClassNotFoundException是一个编译时异常。相对于ClassNotFoundException而言,NoClassDefFoundError更难被排查。
什么时候发生?
发生NoclassDefFoundError通常有两种情况:
- 目标class或其所在的jar包不在运行时的classpath中,或者classpath在不同的类加载器加载时被覆盖了。总之,就是类加载器在寻找目标类时找不到了。
- 类加载器能够找到该类,但是在创建实例或调用该类时,初始化类成员过程出错。
如何排查?
程序日志出现了NoClassDefFoundError错误,要按以下步骤进行排查:
- 确定目标class所在的jar包。
- 检查jar包或war包的MANIFEST.MF文件,查看目标jar是否存在其Class-Path参数中。
- 仔细排查目标class,检查其所引入的类是否存在于其所对应的jar包中,排查jar包冲突或版本问题。
一次排查过程
最近在虚拟机上安装apache atlas过程中出现了NoClassDefFoundError错误,如下。
2020-10-29 11:55:03,718 WARN - [main:] ~ Failed to obtain graph instance on attempt 1 of 3 (AtlasGraphP