“ NoClassDefFoundError:无法初始化类”错误


77

当我运行项目时,会收到此错误的大量输出:

2009年9月9日,上午8:22:23 org.apache.catalina.core.StandardWrapperValve调用
严重:Servlet Jersey的Servlet.service()抛出异常
java.lang.NoClassDefFoundError:无法初始化类SpringFactory
        在com.point2.prospect.persistence.hibernate.HibernateTransactionInterceptor.doFilter(HibernateTrans
actionInterceptor.java:17)
        在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        在com.point2.prospect.restapi.ServerErrorInterceptor.doFilter(ServerErrorInterceptor.java:27)
        在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583)
        在org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:447)
        在java.lang.Thread.run(Thread.java:619)

我注意到此问题的出现方式是在整个网络上被询问,但没有真正的答案。这种错误的一般原因是什么?

Answers:


204

NoClassDefFound错误是一个模糊的错误,通常隐藏着更严重的问题。它是一样的ClassNotFoundException(被抛出时,该类只是普通的不存在)。

如javadocs所示,NoClassDefFound可能指示该类不存在,但是通常在类加载器为该类加载字节并在其上调用“ defineClass”后抛出该类。还要仔细检查您的完整堆栈跟踪是否有其他线索或可能的“原因”异常(尽管您的特定回溯没有显示任何异常)。

当您遇到NoClassDefFoundError时,首先要看的是类的静态位,即在类定义期间发生的任何初始化。如果失败,它将引发NoClassDefFoundError-应该抛出ExceptionInInitializerError并指出问题的详细信息,但是以我的经验,这些很少见。它只会在第一次尝试定义类时执行ExceptionInInitializerError,之后将仅抛出NoClassDefFound。因此,请查看较早的日志。

因此,我建议您查看该HibernateTransactionInterceptor行中的代码,并查看其要求。似乎无法定义类SpringFactory。因此,也许可以检查该类中的初始化代码,这可能会有所帮助。如果可以调试,则将其停在(17)的最后一行并进行调试,以便尝试查找导致异常的确切行。另外,请在日志中检查更高的位置,如果非常幸运,可能会出现ExceptionInInitializerError。


22
谢谢。将我的注意力转向静态初始值设定项可以节省数小时的麻烦。
鲍里斯·布鲁德诺伊

1
“即在类定义期间发生的任何初始化” –谢谢!
Matt MacLean 2012年

2
另一个好主意是将日志传送到文件并查找java.lang.ClassNotFoundException。那里可能有一个流浪者,它会告诉您它试图加载哪个类,该类产生了所有NoClassDefFoundError异常。为我工作。
瑞安·希灵顿

还有要添加的内容...如果一个类找不到所需的类,我也发现您收到NoClassDefFoundError。因此,对于无法找到的类,您将获得一个未找到的类异常;对于所定义的类,将获得NoClassDefFoundError。
Michael Wiles 2013年

1
这样做的原因是静态初始化器只运行一次……该规则保持一致。因此,如果它运行一次并且失败,它将引发ExceptionInInitializer错误。之后,它会缓存静态初始化器的结果...
Michael Wiles

6

您缺少必要的类定义;通常是由于所需的JAR不在类路径中引起的。

J2SE API

公共类NoClassDefFoundError扩展LinkageError

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分或使用新表达式创建新实例的一部分)而抛出,则找不到该类的定义。

当前编译的类在编译时就存在搜索到的类定义,但不再可以找到该定义。


2
缺少的类的实际名称应该在某个地方的嵌套异常消息中。
斯蒂芬·C

1

我曾经遇到过同样的问题,因为jar库是由其他Linux用户(root)复制的,并且登录的用户(进程)没有足够的权限来读取jar文件的内容。


0

我有这个:

 class Util {
  static boolean isNeverAsync = System.getenv().get("asyncc_exclude_redundancy").equals("yes");
}

您可能会看到问题,env var可能返回null而不是字符串。因此,为了检验我的理论,我将其更改为:

 class Util {
  static boolean isNeverAsync = false;
}

问题就解决了。太可惜了,Java无法为您提供错误的确切堆栈跟踪信息,有点奇怪。


0

最近,我在Windows 10上遇到了此错误。事实证明Windows正在寻找我的项目所需的.dll文件,但找不到它们,因为它在系统路径PATH中而不是在CLASSPATH或-Djava中寻找它们.library.path


-2

当我看到此错误时,意识到我正在使用OpenJDK。一旦安装了Oracle JDK,便对其进行了修复。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.