Программное изменение импорта пакетов OSGi

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


person Jeewantha    schedule 05.07.2013    source источник
comment
Почему? Если пакет A действует по-разному в зависимости от существующих пакетов, которые зависят от пакета A, то вам, вероятно, следует разделить пакет A на отдельные пакеты, Bundle AC и Bundle AB, каждый из которых имеет свой собственный файл MANIFEST.MF. Если я понимаю, в этом и смысл. Вам не нужно выполнять странные трюки с Classpath, чтобы получить такое динамическое поведение, но вам нужно правильно структурировать свои пакеты.   -  person Sheena Artrip    schedule 05.07.2013
comment
+1 за комментарий @SheenaArtrip. Нет абсолютно никакой веской причины делать то, что вы пытаетесь сделать.   -  person Neil Bartlett    schedule 05.07.2013
comment
Есть причина. Bundle A включает в себя спящий режим и множество служебных классов, необходимых для доступа к БД. Но классы сущностей находятся в разных пакетах (B и C). Объекты добавляются в конфигурацию Hibernate на этапе активации пакетов. Даже если сущности добавлены правильно, пакет A не может видеть классы сущностей, если они не импортированы явным образом. Я хочу иметь возможность добавить еще один пакет D с другим классом объекта базы данных, не импортируя его вручную в пакет A. Когда я хочу удалить B, мне не нужно вручную удалять оператор импорта.   -  person Jeewantha    schedule 06.07.2013
comment
Динамический импорт решил проблему. Большое спасибо за помощь :).   -  person Jeewantha    schedule 06.07.2013
comment
Динамический импорт доставит вам больше проблем, чем он того стоит.   -  person Neil Bartlett    schedule 06.07.2013
comment
Не могли бы вы сказать мне, почему? Или направьте меня к какому-нибудь документу, объясняющему проблему с динамическим импортом?   -  person Jeewantha    schedule 06.07.2013


Ответы (3)


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

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

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

person Gunnar    schedule 05.07.2013
comment
Спасибо Гуннар. Динамический импорт был именно тем, что я искал :) wiki.osgi.org/wiki/DynamicImport-Package - person Jeewantha; 06.07.2013

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

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

person bzzzrd    schedule 05.07.2013

Действительно, это указывает на архитектурные проблемы. Особенно известно, что спящий режим требует от вас использования динамического импорта для доступа к вашим объектам 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

person Christian Schneider    schedule 06.07.2013