Как управлять пакетами / зависимостями во встроенном приложении OSGi?
В настоящее время я разрабатываю систему плагинов, в которую я встраиваю apache felix в свое приложение. Сами плагины - это пакеты OSGi. Пока развертывание пакетов работает просто отлично, но у меня проблемы с взаимодействием с моими пакетами / плагинами. Я попробовал два подхода:
- Зарегистрируйте службу "Плагин" в моем плагине и используйте прослушиватель службы в моем "хост-приложении" для взаимодействия с плагинами.
Слушатель службы не вызывается, и я не могу привести возвращаемый объект Plugin, потому что класс Plugin.c в моем приложении Host отличается от класса Plugin.class, который находится внутри комплекта.
- Зарегистрируйте "PluginManager" в хост-приложении и загрузите этот менеджер в комплекте.
В этом случае я снова не могу привести класс обслуживания из-за этой проблемы "дублирования" класса.
Я понимаю, почему классы "дублируются", но я не уверен, что с этим делать.
Моя текущая настройка:
- Модуль plugin-api maven: Предоставляет интерфейс плагина
- модуль app maven: содержит приложение, которое встраивает Apache Felix
- фиктивный плагин зависит только от плагина-API
Есть ли проблема с тем, как мои настройки структурированы? Как я могу получить доступ к службам хоста, не создавая беспорядок в классе? Должен ли я создать другой модуль, который используется для компиляции моего плагина, но он исключен из комплекта и позже предоставлен на хосте через FRAMEWORK_SYSTEMPACKAGES_EXTRA?
1 ответ
Вы должны определить свой Plugin API (и все типы не на основе VM, которые он использует) на стороне приложения. Если бы я сделал это, я бы сделал пакет API (да), который экспортирует эти пакеты.
Убедитесь, что все плагины не экспортируют API или, по крайней мере, позволяют импортировать его.
В вашем приложении перед запуском встроенной среды Felix вы получите все манифесты всех JAR-файлов на пути к классам с помощью getResources("META-INF/MANIFEST.MF")
и проверить на Export-Package
, Затем объедините все эти экспортированные пакеты и установите свойство OSGi Framework. org.osgi.framework.system.packages.extra
к присоединяемой строке.
Это позволит экспортировать любой пакет в ваш путь к классам, а также в ваш пакет API. Поскольку платформа теперь экспортирует эти пакеты, ваши плагины будут использовать стандартный путь к классам в качестве поставщика. Поэтому у API будет только один источник, и вы не попадете в ад класса.