Ошибка «NoClassDefFoundError: Не удалось инициализировать класс» - PullRequest
70 голосов
/ 09 сентября 2009

Когда я запускаю свой проект, я получаю множество выводов этой ошибки:

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)

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

Ответы [ 5 ]

184 голосов
/ 13 сентября 2009

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

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

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

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

6 голосов
/ 09 сентября 2009

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

Из J2SE API :

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

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

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

1 голос
/ 30 августа 2015

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

0 голосов
/ 21 февраля 2019

У меня было это:

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

вы, вероятно, видите проблему, env var может возвращать ноль вместо строки. Поэтому, чтобы проверить свою теорию, я изменил ее на:

 class Util {
  static boolean isNeverAsync = false;
}

и проблема ушла. Жаль, что Java не может дать вам точную информацию об ошибке стека, как бы странно.

0 голосов
/ 23 октября 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...