“NoClassDefFoundError:无法初始化类”错误
Posted
技术标签:
【中文标题】“NoClassDefFoundError:无法初始化类”错误【英文标题】:"NoClassDefFoundError: Could not initialize class" error 【发布时间】:2009-09-09 17:58:50 【问题描述】:当我运行我的项目时,我得到了很多关于这个错误的输出:
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)我注意到这个问题在整个网络上都有被问到的模式,但没有真正的答案。这种错误的一般原因是什么?
【问题讨论】:
【参考方案1】:NoClassDefFound 错误是一个模糊的错误,通常隐藏一个更严重的问题。它不与 ClassNotFoundException 相同(当类不存在时抛出)。
NoClassDefFound 可能表示类不存在,正如 javadocs 所指出的那样,但它通常在类加载器加载类的字节并在它们上调用“defineClass”之后抛出。还要仔细检查您的完整堆栈跟踪是否有其他线索或可能的“原因”异常(尽管您的特定回溯显示没有)。
当您收到 NoClassDefFoundError 时首先要查看的是类的静态位,即在定义类期间发生的任何初始化。如果失败,它将抛出 NoClassDefFoundError - 它应该抛出 ExceptionInInitializerError 并指出问题的详细信息,但根据我的经验,这些很少见。它只会在第一次尝试定义类时执行 ExceptionInInitializerError,之后它只会抛出 NoClassDefFound。因此,请查看早期的日志。
因此,我建议查看 HibernateTransactionInterceptor 行中的代码并了解它需要什么。似乎无法定义类 SpringFactory。因此,也许检查该类中的初始化代码,这可能会有所帮助。 如果您可以调试它,请在上面的最后一行 (17) 处停止它并调试到,以便您可以尝试找到导致异常的确切行。还要检查日志中的更高级别,如果你很幸运,可能会出现 ExceptionInInitializerError。
【讨论】:
谢谢。将注意力转向静态初始化程序块可以节省数小时的麻烦。 "即在定义类期间发生的任何初始化" -- 谢谢! 另一个好主意是将您的日志通过管道传输到文件并查找 java.lang.ClassNotFoundException。那里可能有一个流浪者,它会告诉你它试图加载的类产生了所有 NoClassDefFoundError 异常。为我工作。 谢谢,这有助于解决偷偷摸摸的 ?。不确定为什么It will only do the ExceptionInInitializerError the first time it tries to define the class, after that it will just throw NoClassDefFound
。如果这是静态初始化程序的问题,那不应该是每次的异常吗?
原因是静态初始化程序只运行一次......该规则保持一致。因此,如果它运行一次并失败,则会引发 ExceptionInInitializer 错误。之后它缓存静态初始化器的结果...【参考方案2】:
您缺少必要的类定义;通常是由于所需的 JAR 不在类路径中。
来自J2SE API:
公共类 NoClassDefFoundError 扩展 LinkageError
如果 Java 虚拟机或 一个 ClassLoader 实例尝试加载 在类的定义中(作为一部分 正常的方法调用或作为 使用 new 创建一个新实例 表达式)并且没有定义 可以找到类。
搜索到的类定义 当前执行时存在 类已编译,但定义 再也找不到了。
【讨论】:
缺少的类的实际名称应该在某处的嵌套异常消息中。【参考方案3】:我也遇到了同样的问题,因为jar库被其他Linux用户(root)复制,登录的用户(进程)没有足够的权限读取jar文件内容。
【讨论】:
【参考方案4】:我有这个:
class Util
static boolean isNeverAsync = System.getenv().get("asyncc_exclude_redundancy").equals("yes");
您可能会看到问题所在,env var 可能返回 null 而不是字符串。 所以只是为了测试我的理论,我把它改成了:
class Util
static boolean isNeverAsync = false;
问题就解决了。太糟糕了,Java 无法为您提供错误的确切堆栈跟踪,这有点奇怪。
【讨论】:
【参考方案5】:我最近在 Windows 10 上遇到了这个错误。事实证明,Windows 正在寻找我的项目所需的 .dll 文件,但找不到它们,因为它在系统路径 PATH 而不是 CLASSPATH 中查找它们或 -Djava.library.path
【讨论】:
【参考方案6】:当我看到这个错误时意识到我正在使用 OpenJDK。一旦我安装了 Oracle JDK,就修复了它。
【讨论】:
以上是关于“NoClassDefFoundError:无法初始化类”错误的主要内容,如果未能解决你的问题,请参考以下文章