"NoClassDefFoundError:无法初始化类"错误

74 java spring exception

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

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)

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

Mic*_*les 194

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

NoClassDefFound 可能表明该类不存在,正如javadocs所指出的那样,但是在类加载器加载了类的字节并在它们上面调用"defineClass"之后,它通常被抛出.还要仔细检查完整堆栈跟踪以获取其他线索或可能的"原因"异常(尽管您的特定回溯显示无).

获得NoClassDefFoundError时首先要查看的是类的静态位,即在定义类时发生的任何初始化.如果失败则会抛出NoClassDefFoundError - 它应该抛出ExceptionInInitializerError并指出问题的详细信息,但根据我的经验,这些很少见.它只会在第一次尝试定义类时执行ExceptionInInitializerError,之后它将抛出NoClassDefFound.所以看看早期的日志.

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

  • 谢谢.将我的注意力转向静态初始化程序块可以节省数小时的恶化. (21认同)
  • “即在类定义期间发生的任何初始化”——谢谢! (2认同)
  • 另一个好主意是将日志传递给文件并查找java.lang.ClassNotFoundException.那里可能有一个流浪的,它会告诉你它正在尝试加载哪个类产生了所有NoClassDefFoundError异常.为我工作. (2认同)
  • 谢谢,这有助于解决一个偷偷摸摸的问题。不确定_为什么_`它只会在第一次尝试定义类时执行 ExceptionInInitializerError ,之后它只会抛出 NoClassDefFound` 。如果这是静态初始化程序的问题,那不是每次都会出现异常吗? (2认同)

Chs*_*y76 6

你错过了必要的类定义; 通常由必需的JAR不在类路径中引起.

来自J2SE API:

公共类NoClassDefFoundError扩展了LinkageError

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

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

  • 缺少的类的实际名称应该在某处的嵌套异常消息中. (2认同)