Как настраиваются пути к классам и загрузчики классов в среде OSGi?

Меня смущает видимость классов в OSGi. Я запускаю Apache Felix и загружаю следующие пакеты:

  • пакеты antlr, asm, jpa и core из eclipselink
  • JAR-файл OSGi для javax.persistence 1.99
  • OSGi-fied jar с драйвером com.mysql.jdbc
  • мой собственный пакет, который содержит аннотированные классы сущностей и persistence.xml
  • еще один мой собственный пакет, который вызывает Persistence.createEntityManagerFactory(String, Map)

Теперь, что меня смущает, так это то, какой пакет должен иметь возможность видеть драйвер MySQL. Я думал, что это будет пакет, создающий EntityManagerFactory, но я получаю ошибки ClassNotFound при импорте в этот манифест. Затем я попытался импортировать его из манифеста пакета eclipselink jpa, но снова ошибся. Только когда я импортирую его из манифеста пакета, содержащего блок сохранения (классы сущностей и persistence.xml), он работает.

Таким образом, кажется, что драйвер базы данных ищет clasloader для пакета PU, но это не имеет для меня смысла. Что происходит?

Кажется, я не могу найти простую документацию для этого. Эти слайды дают некоторые подсказки, но не совсем исчерпывающие.


person Hanno Fietz    schedule 13.08.2009    source источник


Ответы (2)


Я знаком с проблемами пути к классам OSGi вокруг Hibernate и JDBC, и я могу изложить вам свои рассуждения о том, что происходит, на основе слайдов, на которые вы ссылались.

Я предполагаю, что вы добавили запись драйвера JDBC в persistence.xml внутри вашего пакета PU?

EclipseLink использует шаблон extender для работы с имя комплекта PU. Расширитель прослушивает запуск пакетов, проверяет, есть ли у них файл persistence.xml, а затем выполняет работу по его настройке. Ожидается, что пакет PU импортирует все типы, на которые вы можете ссылаться в файле persistence.xml, включая драйвер JDBC.

Подумай об этом. Пакет EclipseLink не будет импортировать все известные драйверы JDBC (и не должен) — только ваши пакеты могут знать, какой драйвер базы данных им нужен, поэтому разумно ожидать, что ваш пакет PU будет импортировать класс драйвера JDBC.

Вам не нужно изменять манифесты сторонних библиотек, если они уже совместимы с OSGi, например EclipseLink.

person SteveD    schedule 14.08.2009
comment
Я передаю драйвер в качестве свойства для createEntityManagerFactory, но я предполагаю, что это одно и то же? Как-то мне это кажется странным. Разве это не должен быть поставщик постоянства, который обрабатывает все специфичные для БД вещи? - person Hanno Fietz; 17.08.2009
comment
Все, что требуется поставщику постоянства, — это драйвер БД, который может обрабатывать интерфейс JDBC. Таким образом, вы сохраняете связь между пакетами на низком уровне. Выбор используемой БД зависит от приложения, поэтому он должен быть частью вашего кода/конфигурации. Это базовый шаблон OSGi: интерфейсы используются в качестве контракта, а некоторый пакет обеспечивает реализацию для предметной области или приложения. - person SteveD; 17.08.2009

Я нашел этот pdf-файл весьма информативным в отношении загрузки классов: http://www.martinlippert.org/events/WJAX2008-ClassloadingTypeVisibilityOSGi.pdf

person Houtman    schedule 31.08.2009