"Ошибка 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)

Я замечаю, что эта проблема имеет образец, который задают во всем Интернете, но без реальных ответов. Что является общей причиной такого рода ошибок?

Ответ 1

Ошибка NoClassDefFound является туманной ошибкой и часто скрывает более серьезную проблему. Это не то же самое, что ClassNotFoundException (которое бросается, когда класс просто отсутствует).

NoClassDefFound может указывать на то, что класс не существует, как указывают javadocs, но его обычно бросают, когда после того, как загрузчик классов загрузил байты для класса и называет их "defineClass". Также тщательно проверьте свою полную трассировку стека на другие подсказки или возможные "причины" Исключения (хотя ваша конкретная обратная трассировка не показывает ни одного).

Первое, что нужно посмотреть, когда вы получаете NoClassDefFoundError, - это статические биты вашего класса, то есть любая инициализация, которая происходит во время определения класса. Если это не удастся, он выкинет NoClassDefFoundError - он должен выбросить ExceptionInInitializerError и указать подробности проблемы, но, по моему опыту, они редки. Он будет выполнять только ExceptionInInitializerError при первом попытке определить класс, после чего он просто выбросит NoClassDefFound. Поэтому посмотрите на более ранние журналы.

Поэтому я бы предложил посмотреть код в этой строке HibernateTransactionInterceptor и посмотреть, что он требует. Похоже, что он не может определить класс SpringFactory. Поэтому, возможно, проверьте код инициализации этого класса, который может помочь. Если вы можете отладить его, остановите его на последней строке выше (17) и отлаживайте, чтобы попытаться найти точную строку, вызывающую исключение. Также проверьте выше в журнале, если вам повезет, может быть ExceptionInInitializerError.

Ответ 2

Вам не хватает необходимого определения класса; обычно вызванный тем, что JAR не находится в пути к классам.

От J2SE API:

открытый класс NoClassDefFoundError расширяет LinkageError

Брошено, если виртуальная машина Java или экземпляр ClassLoader пытается загрузить в определении класса (как часть обычного вызова метода или как часть создание нового экземпляра с использованием нового выражение), и определение класс.

Определенное определение класса существует, когда выполняемый в настоящее время класс был скомпилирован, но определение больше не может быть найден.

Ответ 3

Я столкнулся с той же проблемой, потому что библиотека jar была скопирована другим пользователем Linux (root), и зарегистрированный пользователь (процесс) не имел достаточных привилегий для чтения содержимого файла jar.

Ответ 4

Понял, что я использовал OpenJDK, когда увидел эту ошибку. Исправлено, как только я установил Oracle JDK.