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

时间:2009-09-09 17:58:50

标签: 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)

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

6 个答案:

答案 0 :(得分:184)

NoClassDefFound错误是一个模糊的错误,并且经常隐藏更严重的问题。 与ClassNotFoundException相同(当类不在那里时抛出它。)

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

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

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

答案 1 :(得分:6)

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

来自J2SE API

  

公共类NoClassDefFoundError   扩展了LinkageError

     

如果是Java虚拟机,则抛出   ClassLoader实例尝试加载   在一个类的定义中(作为一部分   正常方法调用或作为一部分   使用new创建一个新实例   表达式)并没有定义   可以找到课程。

     

搜索的类定义   当前执行时存在   类被编译,但定义   再也找不到了。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我有这个:

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

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

 class Util {
  static boolean isNeverAsync = false;
}

问题消失了。真是太奇怪了,Java不能为您提供错误的确切堆栈跟踪信息。

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

当我看到这个错误时意识到我正在使用OpenJDK。修复了我安装Oracle JDK后的问题。