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

2022-08-31 12:27:00

当我运行我的项目时,我得到这个错误的许多输出:

Sep 9, 2009 8:22:23 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Jersey threw exception
java.lang.NoClassDefFoundError: Could not initialize class SpringFactory
        at com.point2.prospect.persistence.hibernate.HibernateTransactionInterceptor.doFilter(HibernateTrans
actionInterceptor.java:17)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at com.point2.prospect.restapi.ServerErrorInterceptor.doFilter(ServerErrorInterceptor.java:27)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)

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


答案 1

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

NoClassDefFound可能指示该类不存在,正如javadocs所指示的那样,但是当类装入器加载了类的字节并对其调用“defineClass”之后,它通常会被抛出。还要仔细检查您的完整堆栈跟踪,以查找其他线索或可能的“原因”异常(尽管您的特定回溯跟踪未显示任何异常)。

当您获得NoClassDefFoundError时,首先要查看的地方是在类的静态位中,即在定义类期间发生的任何初始化。如果这失败了,它将抛出一个NoClassDefFoundError - 它应该抛出一个ExareInitializerError并指示问题的细节,但根据我的经验,这些是罕见的。它只会在第一次尝试定义类时执行 ExceptionInInitializerError,之后它只会抛出 NoClassDefFound。因此,请查看早期的日志。

因此,我建议查看HibernateTransactionInterceptor行中的代码,看看它需要什么。它似乎无法定义类SpringFactory。因此,也许可以检查该类中的初始化代码,这可能会有所帮助。如果可以调试它,请将其停在上面的最后一行 (17) 并调试到,以便可以尝试找到导致异常的确切行。还要检查日志中的较高位置,如果您非常幸运,可能会有一个 ExceptionInitializerError。


答案 2

你错过了必要的类定义;通常是由于所需的 JAR 不在类路径中而导致的。

来自 J2SE API

公共类 NoClassDefFoundError 扩展了 LinkageError

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

编译当前正在执行的类时,搜索的类定义存在,但无法再找到该定义。