NoClassDefFoundError Использование Hibernate

Я использую Spring 3.1.1.RELEASE и Hibernate 4.1.10.FINAL в Building Block на Blackboard Learn и получаю следующее исключение:

java.lang.NoClassDefFoundError: не удалось инициализировать класс org.hibernate.cfg.PropertyContainer

Похоже, это проблема пути к классам, поэтому я немного покопался и добавил предложенные библиотеки из этот пост, но возникает та же ошибка.

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

Изменить: я проверил, что JAR-файл jboss-loging находится в моем пути к классам.

Изменить: Запрошенная трассировка стека: https://gist.github.com/whargrove/79cbc9c5bd65217e3da3

После перезапуска Tomcat и повторного развертывания моей WAR в журналах Tomcat наблюдаются следующие исключения:

  1. java.security.AccessControlException: доступ запрещен ("java.util.PropertyPermission" "jboss.i18n.generate-proxy" "запись")
  2. org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем mySessionFactory, определенным в ресурсе ServletContext [/WEB-INF/config/spring.xml]: не удалось вызвать метод инициализации; вложенным исключением является java.lang.NoClassDefFoundError: не удалось инициализировать класс org.hibernate.cfg.PropertyContainer

(Полная трассировка стека доступна по ссылке выше.)


person Wes    schedule 04.08.2014    source источник
comment
Как вы запускаете свое приложение? Если вы все еще получаете ту же ошибку, это потому, что где-то все еще есть проблема с classpath.   -  person Patrick Grimard    schedule 04.08.2014


Ответы (1)


Сообщение

java.lang.NoClassDefFoundError: не удалось инициализировать класс SomeClass

означает, что JVM уже пыталась и не смогла выполнить статическую инициализацию класса SomeClass. Вполне может быть другая ошибка, которая произошла ранее, когда JVM пыталась загрузить класс в первый раз.

Посмотрите на источник класса PropertyContainer, единственная статическая инициализация — это статический инициализатор, который устанавливает системное свойство, и строка, которая инициализирует средство ведения журнала для класса. Установка системного свойства will не должна вызывать проблем, поэтому я предполагаю, что используемый класс регистратора отсутствует в вашем пути к классам.

Используемый класс регистратора — org.jboss.logging.Logger. Быстрый Google для этого класса предложил банку с именем jboss-logging.jar. Попробуйте получить копию этого и добавить его в свой путь к классам.

(Кстати, если вы не можете найти предыдущую ошибку перед ошибкой «Не удалось инициализировать класс», это вполне может быть связано с тем, что отсутствующий JAR влияет на ведение журнала. Ведение журнала — это то, что приложения, как правило, предполагают, всегда работает и может использоваться везде. Исключение, которое вы видите, могло быть сгенерировано из блока finally, который пытался выполнить некоторую регистрацию, когда соответствующий блок try также пытался выполнить некоторую регистрацию, но выдал исключение Исключение, сгенерированное из блока finally, заменяет любое исключение, которое ранее было бросил.)

ИЗМЕНИТЬ в ответ на трассировку стека: теперь я вижу, что ошибался, говоря, что установка системного свойства не является проблемой! Я ничего не знаю о Blackboard Learn, но возможно, что это или что-то еще усилило безопасность вашего приложения и, следовательно, вызвало вышеуказанную проблему.

Однако это подтверждает мою уверенность в том, что настоящая причина проблемы была до сообщения Could not initialize class.

person Luke Woodward    schedule 04.08.2014
comment
Вот и я так же подумал. У меня есть compile "org.hibernate:hibernate-entitymanager:4.1.10.FINAL" в моем файле gradle.build, и в результате указанный вами JAR-журнал jboss включен в каталог WEB-INF/lib, когда я упаковываю проект в WAR. Будет ли иметь значение добавление файла JAR локально по сравнению с его получением через транзитивную зависимость? - person Wes; 04.08.2014
comment
Когда вы получаете ошибку? Запуск модульных тестов? Запуск вашего кода из командной строки? Запускаете свое приложение в Tomcat или другом веб-сервере? - person Luke Woodward; 04.08.2014
comment
Ошибка возникает при запуске приложения в Tomcat, и я перехожу на любую страницу, использующую Spring MVC. Если быть точным, он работает как расширение Blackboard Learn (система управления обучением для университетов). - person Wes; 04.08.2014
comment
Если вы перезапустите Tomcat, вы получите ту же ошибку при первом переходе на страницу Spring MVC? Есть ли какие-либо сообщения в журналах вашего приложения (при условии, что ведение журнала вообще работает)? Что-нибудь в журналах Tomcat? - person Luke Woodward; 04.08.2014
comment
Да, проблема все еще возникает после перезапуска Tomcat. Это исключение регистрируется в журналах Tomcat stdout-stderr: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in ServletContext resource [/WEB-INF/config/spring.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.cfg.PropertyContainer - person Wes; 04.08.2014
comment
@whargrove: не могли бы вы отредактировать свой вопрос, включив в него это сообщение об исключении и полную трассировку стека. Кроме того, является ли это сообщение об ошибке первым сообщением об ошибке, записанным в журналы после перезапуска Tomcat? - person Luke Woodward; 05.08.2014
comment
Я добавил ссылку на полную трассировку стека в вопросе. Похоже, это проблема java.security.AccessControlException, из-за которой PropertyContainer не инициализируется. - person Wes; 05.08.2014
comment
@whargrove: проблема возникает из-за системного свойства. Следующим шагом будет обойти это исключение AccessControlException. Там должно быть много результатов Google, чтобы помочь вам в этом. - person Luke Woodward; 05.08.2014