Классы OSGI не видны, хотя необходимые JAR-файлы находятся в Bundle-classpath - PullRequest
3 голосов
/ 22 ноября 2011

Мы используем OSGI-каркас на основе Equinox для запуска нескольких пакетов.
Наши пакеты имеют зависимые JAR-файлы в Bundle-classpath, а зависимые JAR-файлы упакованы вместе с остальными классами и ресурсами в один файл JAR / WAR. Но у нас есть проблема при запуске нескольких таких комплектов.
Скажем,
Пакет A: Полностью протестированный / рабочий пакет JAR. Содержит все зависимые файлы JAR в пути к классам комплекта и все зависимые файлы JAR внутри (в папке с именем lib). Работает нормально при тестировании путем развертывания только этого пакета

Пакет B: аналогично Пакету А. Снова работает при развертывании отдельно

Но когда оба пакета загружаются вместе, OSGI не может загружать классы из JAR, упомянутых в bundle-classpath для пакета, который загружается вторым. Пакет, загруженный первым, работает нормально, а пакет, загруженный вторым, завершается неудачей.

В настоящее время эта проблема возникает, когда SPRING пытается загрузить класс javax.persistence.QueryHint.

Мы создаем источник данных, используя наш xxxx-EntityManager.xml, где мы создаем наш entityManagerFactory

Используются зависимые JAR: (одинаковые JAR в обоих комплектах)

  • Пружина: 3.0.6. ВЫПУСКНЫЕ ЯЩИКИ
  • Hibernate: 3,6,7 JARS
  • Hibernate-JPA: hibernate-jpa-2.0-api-1.0.1.Final.jar

Исключение: PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'targetDataSources' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [xxxx-EntityManager.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: interface javax.persistence.QueryHint is not visible from class loader at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358)

Примечание:

  • Оба комплекта были индивидуально протестированы и работают нормально
  • Мы знаем, что вместо создания Bundle-classpath мы можем извлечь сторонние JAR-файлы вне пакетов и использовать import-package. Но для этого текущего требования нам нужны сторонние JAR-файлы только внутри родительского пакета.

Запрос экспертов OSGI, пожалуйста, помогите нам.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Я рекомендую поместить ваши зависимости в отдельные пакеты и сделать все пакеты видимыми для других пакетов. Затем добавьте эти отдельные пакеты как зависимости (или лучше: импортируйте только требуемые пакеты вместо всего пакета!). Таким образом, вы можете убедиться, что ваши зависимости загружены только один раз. Я полагаю, что ваша текущая конфигурация приводит к проблемам при загрузке классов, так как классы загружаются дважды с наиболее вероятным serialVersionUID А так как каждый пакет имеет свой собственный загрузчик классов, вторичный (не) загруженный класс не будет виден второму пакету.

0 голосов
/ 23 ноября 2011

Если вы не можете упаковать JAR-файлы как отдельные пакеты, укажите a или B, чтобы они содержали все JAR-файлы, экспортируйте все пакеты и сделайте так, чтобы другой пакет зависел от него (и удалите JAR-файлы из второго пакета).

...