2009-08-13 5 views
3

Я смущен о видимости класса в OSGi. Я бег Apache Felix и загрузки следующих связок:В среде OSGi, как настраиваются классовые классы и загрузчики классов?

  • antlr, asm, jpa и core пучков на EclipseLink от
  • OSGi-Fied банки для javax.persistence 1,99
  • OSGi-Fied банки с com.mysql.jdbc водитель
  • пучок из моих собственных, который содержит аннотированные классы сущностей и persistence.xml
  • другой сверток из моих собственных, что вызывает Persistence.createEntityManagerFactory(String, Map)

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

Так что, по-видимому, драйвер базы данных просматривается класс-загрузчиком для пула ПУ, но для меня это не имеет смысла. Что происходит?

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

ответ

3

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

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

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

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

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

+0

Я передаю водитель как свойство createEntityManagerFactory, но я предполагаю, что это то же самое? Мне почему-то это кажется странным. Разве это не должен быть поставщик постоянства, который обрабатывает все специфические вещи? –

+0

Для всех поставщиков постоянства требуется драйвер DB, который может обрабатывать интерфейс JDBC. Таким образом, вы держите связь между пучками низко. Выбор какой БД для использования является специфичным для приложения, поэтому он должен быть частью вашего кода/config. Это базовая модель с OSGi: в качестве контракта используются интерфейсы, а некоторые пакеты обеспечивают реализацию домена или приложения. – SteveD

Смежные вопросы