В моем приложении Equinox OSGi есть общий пакет (A), который используется для общей задачи. Но пакет A импортирует пакеты из многих других пакетов в зависимости от обстоятельств. Я имею в виду, что когда Bundle A и Bundle B находятся в среде выполнения, A должен импортировать пакет «com.b.package1». Когда Bundle A и Bundle C находятся в среде выполнения, A должен импортировать пакет «com.c.package2». Для этого мне приходится вручную изменять оператор импорта в файле MANIFEST.MF в комплекте A каждый раз, когда я хочу изменить среду выполнения. Есть ли способ справиться с этим программно. Может быть, используя собственный загрузчик классов в комплекте A? Любая помощь приветствуется.
Программное изменение импорта пакетов OSGi
Ответы (3)
Чтобы ответить на ваш вопрос, невозможно создать собственный загрузчик класса пакета независимым от фреймворка способом. Тем не менее, есть доступные альтернативы.
Одним из возможных способов может быть использование динамического импорта. Тогда оба пакета могут быть доступны во время выполнения. Если сделать оба импорта необязательными, это тоже может сработать.
Вам также обязательно следует обратиться к службам OSGi для вашего подхода (или к декларативным службам).
Вам следует рассмотреть возможность реализации B и C в качестве служб OSGi.
Попытка получить динамическое поведение чего-то, что должно быть статичным, может указывать на архитектурные проблемы.
Действительно, это указывает на архитектурные проблемы. Особенно известно, что спящий режим требует от вас использования динамического импорта для доступа к вашим объектам 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