2013-07-05 3 views
0

В моем приложении OSGi Equinox есть общий комплект (A), который используется для общей задачи. Но пакет A импортирует пакеты из многих других пакетов в зависимости от обстоятельств. Я имею в виду, когда Bundle A и Bundle B находятся во время выполнения, A должен импортировать пакет «com.b.package1». Когда Bundle A и Bundle C находятся во время выполнения, A должен импортировать пакет «com.c.package2». Для этого я должен каждый раз менять время выполнения изменения в файле MANIFEST.MF в пакете А вручную. Есть ли способ обработать это программно. Может быть, используя пользовательский загрузчик классов в комплекте A? Любая помощь приветствуется.Программно изменяемый импорт пакетов OSGi

+2

Почему? Если пучок А действует по-разному в зависимости от существующих пучков, которые зависят от Bundle A, тогда вам, вероятно, следует разделить Bundle A на отдельные пучки, Bundle AC и Bundle AB, оба из которых имеют свой собственный MANIFEST.MF. Если я понимаю, это своего рода точка. Вам не нужно выполнять странные методы обхода класса, чтобы получить такое динамическое поведение, но вам нужно правильно структурировать ваши пакеты. –

+0

+1 для комментария @ SheenaArtrip. Нет абсолютно никаких оснований делать то, что вы пытаетесь сделать. –

+0

Есть причина. Пакет A включает в себя спящий режим и множество полезных классов, необходимых для доступа к БД. Но классы сущностей находятся в разных пучках (B и C). Объекты добавляются в конфигурацию Hibernate во время фазы активации пакетов. Несмотря на то, что сущности добавлены правильно, пакет A не может видеть классы сущностей, если они явно не импортированы. Я хочу иметь возможность добавить еще один пакет D с другим классом базы данных, не импортируя вручную его в пучок A. Когда я хочу удалить B, мне не нужно вручную удалять инструкцию импорта. – Jeewantha

ответ

1

Чтобы ответить на ваш вопрос, создать пользовательский загрузчик классов пакетов невозможно независимо. Однако есть альтернативы.

Одним из возможных способов может быть использование динамического импорта. Тогда оба пакета могут быть доступны во время выполнения. Также возможно использование обоих импортных опций.

Вы также должны обязательно посмотреть службы OSGi для своего подхода (или в декларативных службах).

+0

Спасибо Gunnar. Динамический импорт был именно тем, что я искал :) http://wiki.osgi.org/wiki/DynamicImport-Package – Jeewantha

1

Вам следует рассмотреть возможность внедрения B и C в качестве служб OSGi.

Попытка получить динамическое поведение чего-то, что должно быть статичным, может быть намеком на архитектурные проблемы.

1

Действительно, это указывает на архитектурные проблемы. Известно, что особенно hibernate требует, чтобы вы использовали динамический импорт для доступа к вашим jpa-объектам. В будущих версиях команда hibernate обещает лучшую поддержку OSGi, но пока она довольно дерьма в OSGi.

Поэтому я предлагаю переключиться на OpenJPA или Eclipselink и использовать Aries JPA для создания JPA EntityManager. Таким образом, EntityManager создается для каждого пакета, и вы можете вводить его как услугу. Если вы хотите, он также заботится о сохранении контейнера. Таким образом, вы можете использовать JPA, как в Java EE.

См http://aries.apache.org/modules/jpaproject.html и http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access

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