Как управлять пакетами / зависимостями во встроенном приложении 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 будет только один источник, и вы не попадете в ад класса.

Другие вопросы по тегам