查找java.lang.NoClassDefFoundError

时间:2018-06-19 15:25:23

标签: java noclassdeffounderror

我正在使用Spring Boot使用java8启动RMI服务器应用程序。在极少数情况下:

  • 应用程序无法初始化类,并抛出“ java.lang.NoClassDefFoundError:无法初始化类X”。
  • X并不总是相同的类,但是到目前为止,所有这些类都具有相同的静态成员初始化。 (并非总是直接,因此stacktrace并不总是指向静态变量...)
  • java进程对jar仍具有有效的读取文件句柄。
  • 该过程开始后jar文件没有更改。
  • 内存不是问题。

由于这个问题非常非常罕见,我无法重现。

您将如何继续发现问题?

是否可以获得有关NoClassDefFoundError真正原因的更多信息?

2 个答案:

答案 0 :(得分:0)

NoClassDefFoundError 发生在编译期间存在该类时,因此该程序成功编译但由于任何原因在运行时不可用。

J2EE环境中,即使存在该类,也可能会得到NoClassDefFoundError,因为相应的类加载器可能看不到该类。

由于问题是在运行时类文件在类路径中不可用,因此确实很难诊断和解决此问题。但是您可以尝试使用这些方法来避免此问题。

  1. 确保该类或包含该类的jar在以下位置可用 类路径。
  2. 如果它在应用程序的类路径中可用,那么很可能 classpath被覆盖。要解决此问题,您需要找到 您的应用程序使用的确切类路径。
  3. 如果应用程序使用多个类加载器,则类 由一个类加载器加载的文件可能无法由其他类加载 装载机。

答案 1 :(得分:0)

java.lang.NoClassDefFoundError:

表示在classpath中找不到您要运行的类。

您需要将包含此类的类或.jar文件添加到java类路径中。

当编译器可以成功编译类但Java运行时无法找到类文件时,将发生错误。通常在执行静态块或初始化类的静态字段时发生异常时发生,因此类初始化失败。

修复: 1.确保在类路径中是否有包含该类的类或jar。

2.classpath,那么很可能是classpath被覆盖

3。如果应用程序使用多个类加载器,则由一个类加载器加载的类可能无法由其他类加载器提供。