2009-09-09 1 views
61

, 나는이 오류의 많은 출력을 얻을 :"NoClassDefFoundError를 : 클래스를 초기화 할 수 없습니다"나는 내 프로젝트를 실행할 때 오류

 
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

필요한 클래스 정의가 누락되었습니다. 일반적으로 필수 JAR이 클래스 경로에 있지 않기 때문에 발생합니다. J2SE API에서

:

public class NoClassDefFoundError extends LinkageError

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

+2

누락 된 클래스의 실제 이름은 어딘가에서 중첩 예외 메시지에 있어야합니다. –

171

NoClassDefFound 오류가 성운 오류가 종종 더 심각한 문제가 숨어있다. 이 아니고이며 ClassNotFoundException과 같습니다 (클래스가 존재하지 않을 때 발생합니다). 수도

NoClassDefFound 은의 javadoc는 표시로 클래스가 존재하지 표시하지만, 클래스 로더는 클래스의 바이트를로드하고 그들에 "defineClass는"을 호출 한 후 때, 그것은 일반적으로 발생합니다. 또한 다른 단서 또는 가능한 "원인"예외에 대한 전체 스택 추적을주의 깊게 확인하십시오 (특정 백 트레이스에 아무 것도 표시하지 않음).

NoClassDefFoundError를 얻을 때 가장 먼저 보는 것은 클래스의 정적 비트, 즉 클래스를 정의하는 동안 이루어지는 초기화입니다. 이 작업이 실패하면 NoClassDefFoundError가 throw됩니다. ExceptionInInitializerError를 발생시켜 문제의 세부 정보를 표시해야하지만 내 경험상 이러한 문제는 드뭅니다. ExceptionInInitializerError는 처음 클래스를 정의하려고 할 때만 NoClassDefFound를 던집니다. 따라서 이전 로그를 살펴보십시오.

그래서 나는 HibernateTransactionInterceptor 라인의 코드를보고 그것이 무엇이 필요한지보고 싶습니다. SpringFactory 클래스를 정의 할 수없는 것 같습니다. 어쩌면 해당 클래스의 초기화 코드를 확인하십시오. 디버깅 할 수있는 경우 위의 마지막 행 (17)에서 중지하고 디버그하여 예외의 원인이되는 정확한 행을 찾으십시오. ExceptionInInitializerError가 매우 운이 좋으면 로그에서 더 높은 곳을 확인하십시오.

+20

감사합니다. 정적 이니셜 라이저 블록에주의를 기울이면 시간이 많이 걸렸습니다. –

+1

"즉, 클래스 정의 중에 일어나는 모든 초기화 -"고마워요! –

+2

또 다른 좋은 생각은 로그를 파일로 파이프하고 java.lang.ClassNotFoundException을 찾는 것입니다. 여기에 누락 된 항목이있을 수 있습니다.이 항목은 NoClassDefFoundError 예외를 생성 한로드 할 클래스를 알려줍니다. 나를 위해 일했다. –

0

jar 라이브러리가 다른 Linux 사용자 (루트)에 의해 복사되고 로그인 한 사용자 (프로세스)가 jar 파일 내용을 읽을 수있는 충분한 권한이 없기 때문에 동일한 문제가 발생했습니다.

0

이 오류가 발생했을 때 OpenJDK를 사용하고 있다는 것을 깨달았습니다. 오라클 JDK를 대신 설치하면 문제가 해결되었습니다.

관련 문제