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

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

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

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

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

Изменить: Я убедился, что JAR-журнал JAR находится в моем classpath.

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

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

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

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

1 ответ

Сообщение

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

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

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

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

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

РЕДАКТИРОВАТЬ в ответ на трассировку стека: теперь я вижу, что я ошибался, задавая системное свойство, которое не является проблемой! Я не знаю в первую очередь о Blackboard Learn, но возможно, что это или что-то еще усилило безопасность в вашем приложении и, следовательно, вызвало вышеуказанную проблему.

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

Другие вопросы по тегам