Nice programing

“NoClassDefFoundError : 클래스를 초기화 할 수 없습니다.”오류

nicepro 2020. 10. 25. 13:04
반응형

“NoClassDefFoundError : 클래스를 초기화 할 수 없습니다.”오류


프로젝트를 실행할 때 다음과 같은 오류가 출력됩니다.

2009 년 9 월 9 일 오전 8:22:23 org.apache.catalina.core.StandardWrapperValve invoke
심각 : 서블릿 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)

이 문제는 웹 전체에서 질문을받는 패턴이 있지만 실제 답변은 없습니다. 이런 종류의 오류의 일반적인 원인은 무엇입니까?


NoClassDefFound 오류는 모호한 오류이며 종종 더 심각한 문제를 숨기고 있습니다. 그것은이다 하지 (클래스가 그냥 일반 거기 경우에 슬로우되는) ClassNotFoundException가 같은.

NoClassDefFound javadocs에서 알 있듯이 클래스가 존재하지 않음을 나타낼 수 있지만 일반적으로 클래스 로더가 클래스에 대한 바이트를로드하고 "defineClass"를 호출 한 후 발생합니다. 또한 전체 스택 추적에서 다른 단서 나 가능한 "원인"예외 (특정 역 추적에 아무것도 표시되지 않음)를주의 깊게 확인하십시오.

NoClassDefFoundError가 발생했을 때 가장 먼저 살펴볼 곳은 클래스의 정적 비트 즉, 클래스를 정의하는 동안 발생하는 초기화입니다. 이것이 실패하면 NoClassDefFoundError가 발생합니다. ExceptionInInitializerError를 발생시키고 문제의 세부 정보를 나타내야하지만 제 경험상 드물게 발생합니다. 클래스를 처음 정의하려고 할 때만 ExceptionInInitializerError를 수행하고 그 후에는 NoClassDefFound를 던집니다. 따라서 이전 로그를 살펴보십시오.

따라서 HibernateTransactionInterceptor 라인의 코드를 살펴보고 무엇이 필요한지 확인하는 것이 좋습니다. SpringFactory 클래스를 정의 할 수없는 것 같습니다. 따라서 해당 클래스의 초기화 코드를 확인하면 도움이 될 수 있습니다. 디버그 할 수 있으면 위의 마지막 줄 (17)에서 중지하고에서 디버그하여 예외를 발생시키는 정확한 줄을 찾을 수 있습니다. 또한 로그에서 더 높은 곳을 확인하십시오. 운이 좋으면 ExceptionInInitializerError가있을 수 있습니다.


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

에서 J2SE API :

공용 클래스 NoClassDefFoundError는 LinkageError를 확장합니다.

Java Virtual Machine 또는 ClassLoader 인스턴스가 클래스 정의를로드하려고 시도하고 (일반 메서드 호출의 일부로 또는 새 표현식을 사용하여 새 인스턴스를 만드는 과정의 일부로) 클래스 정의를 찾을 수없는 경우 발생합니다.

검색된 클래스 정의는 현재 실행중인 클래스가 컴파일 될 때 존재했지만 더 이상 정의를 찾을 수 없습니다.


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


나는 이것을 가지고 있었다 :

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

아마도 문제를 볼 수 있습니다. env var는 문자열 대신 null을 반환 할 수 있습니다. 그래서 내 이론을 테스트하기 위해 다음과 같이 변경했습니다.

 class Util {
  static boolean isNeverAsync = false;
}

문제가 사라졌습니다. Java가 오류의 정확한 스택 추적을 제공 할 수 없다는 것이 너무 안타깝습니다.


이 오류를 보았을 때 OpenJDK를 사용하고 있음을 깨달았습니다. 대신 Oracle JDK를 설치하면 문제가 해결되었습니다.

참고 URL : https://stackoverflow.com/questions/1401111/noclassdeffounderror-could-not-initialize-class-error

반응형