«Java.lang.NoClassDefFoundError: org / hibernate / proxy / HibernateProxy» в Eclipse

1

У меня есть приложение Eclipse на основе плагинов, в котором я помещаю свои постоянные данные в X-плагин и службу hibernate-database в Y-плагин.

Персистентные классы находятся в X, а HibernateUtil, Dao, все связанные с гибернацией банки и файлы сопоставления hbm.xml для постоянных классов находятся в Y.

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

java.lang.RuntimeException
javassist.CannotCompileException
java.lang.ClassNotFoundException
org.hibernate.HibernateException

Все они заканчиваются на "java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy"

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

Есть ли способ избавиться от этой проблемы без слияния плагинов X и Y в один плагин?

  • 0
    Я полагаю, что вы хотите, чтобы два плагина работали независимо друг от друга, верно? Если это так, вы должны убедиться, что оба плагина могут работать без другого, т.е. зависимости jar объявляются независимо для каждого плагина.
  • 0
    Зависимости jar независимы для каждого плагина. Но плагин Y зависит от X. Потому что ему нужны постоянные классы, предоставляемые X.
Теги:
hibernate
eclipse-plugin

5 ответов

1

Проблема, скорее всего, не связана с механизмом загрузки плагинов eclipse. Там исправление для этого - приятель загрузки.

В файле MANIFEST.MF плагина Hibernate (который НЕОБХОДИМО загружать приятель), например org.hibernate.eclipse, добавьте строку:

Eclipse-BuddyPolicy:registered 

и в файле MANIFEST.MF вашего проекта плагина или проекта RCP добавьте строку:

Eclipse-RegisterBuddy:org.hibernate.eclipse

Это должно решить проблему.

Вот сообщение в блоге об этой проблеме:

http://hwellmann.blogspot.de/2008/11/hibernate-and-osgi-pragmatic-solution.html

  • 0
    Спасибо за ваше предложение, но, к сожалению, этот подход не подходит для моей модульности osgi. Я имею в виду, что org.hibernate.eclipse является универсальным и не должен зависеть ни от чего в моей системе.
0

У меня было это исключение, которое проводило тест Arquillian. В моем случае я забыл добавить persistence.xml в архив:

archive.addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml");
0

В корне это классическая проблема OSGi ClassLoader. Решение зависит от версии Hibernate, которую вы используете.

Hibernate 4.X

Вы должны установить ProxyFactory classLoaderProvider для предоставления загрузчика классов, который включает

  1. Классы объектов
  2. Прокси-сервер Hibernate (org.hibernate.proxy)
  3. Прокси Javassist (javassist.util.proxy)

Hibernate 5.X

Hibernate теперь использует загрузчик классов класса entity на фабрике прокси. Вы должны включить прокси-сервер Hibernate (org.hibernate.proxy) и Javassist (javassist.util.proxy) в разделе Import-Package манифеста OSGi пакета (ов), который содержит классы сущностей 3, которые могут отличаться от который создает EntityManagerFactory.

0

Это решает проблему:

В X плагине Eclipse-BuddyPolicy: зарегистрировано

В Y-плагине Require-Bundle: (x plugin id) Eclipse-RegisterBuddy: (x плагин id)

0

Поддерживаемые библиотеки Hibernate были пропущены в вашем удаленном развертывании.

создайте папку lib разделе WEB-INF и скопируйте все поддерживающие файлы jar в эту папку lib.

  • 0
    Я сделал, как вы сказали, но это не сработало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню