перегрузка - копирующий конструктор java



«Ошибка NoClassDefFoundError: Не удалось инициализировать класс» (3)

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

Из J2SE API :

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

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

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

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

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)

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


Answer #1

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

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

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

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


Answer #2

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