“NoClassDefFoundError:无法初始化类”错误
当我运行我的项目时,我得到了这个错误的许多输出:
2009年9月9日上午8时22分23秒org.apache.catalina.core.StandardWrapperValve invoke SEVERE:servlet Jersey的Servlet.service()抛出exception 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)
我注意到,这个问题有一个在networking上被问到的模式,但没有真正的答案。 什么是这种错误的一般原因?
NoClassDefFound错误是一个模糊的错误,往往隐藏一个更严重的问题。 它和ClassNotFoundException 不一样(当类不存在的时候抛出)。
NoClassDefFound 可能表示该类不存在,正如javadoc指示的那样,但是在类加载器加载类的字节并在其上调用“defineClass”之后,通常会抛出该类。 还仔细检查你的完整的堆栈跟踪其他线索或可能的“原因”例外(虽然你的特定回溯显示没有)。
当你得到一个NoClassDefFoundError的时候,首先要看你的类的静态位,也就是定义类时发生的任何初始化。 如果失败,它会抛出一个NoClassDefFoundError – 它应该抛出一个ExceptionInInitializerError,并指出问题的细节,但在我的经验,这些是罕见的。 它只会在第一次尝试定义类时执行ExceptionInInitializerError,之后它将抛出NoClassDefFound。 所以看看以前的日志。
因此,我会build议看看那个HibernateTransactionInterceptor行中的代码,看看它是什么需要。 看来,它无法定义类SpringFactory。 所以也许检查该类中的初始化代码,这可能会有所帮助。 如果你可以debugging它,把它停在上面的最后一行(17),然后debugging,所以你可以试着find引起exception的确切行。 同时检查日志中的更高级别,如果非常幸运可能会出现ExceptionInInitializerErrorexception。
你错过了必要的类定义; 通常由所需的JAR不在类path中引起。
从J2SE API :
公共类NoClassDefFoundError扩展LinkageError
如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分,或者作为使用新expression式创build新实例的一部分),并且没有find该类的定义,则抛出它。
search到的类定义存在于当前正在执行的类被编译时,但定义不能再被find。
我遇到了同样的问题,因为jar库是由其他Linux用户(root)复制的,并且login用户(进程)没有足够的权限来读取jar文件的内容。
意识到当我看到这个错误时我正在使用OpenJDK。 修正了一次,我安装了Oracle JDK。