2015-09-06 2 views
0

В настоящее время я работаю над добавлением модульности OSGi к проекту с целью плагинов . Основная идея заключается в том, что пользователи могут разрабатывать свои собственные плагины, которые могут быть добавлены во время выполнения в основное приложение для расширения или изменения его функций и/или возможностей.Определение API-интерфейса хоста со встроенным OSGi

Например, основное приложение использует Restlets для определения HTTP API для приложения. Пользователь может пожелать создать плагин для добавления конечной точки с определенной функцией. Или они могут пожелать создать новый объект, который хранится в базе данных с определенной целью.

Я понимаю, что это не «истинная» реализация модульного приложения OSGi, и после некоторых исследований мне удалось довольно легко добавить возможности OSGi к существующему проекту со встроенным Felix. Наряду с felix.fileinstall приложение наблюдает за папкой развертывания и автоматически устанавливает и запускает пакеты баннеров, которые удаляются в папку развертывания (останавливается и удаляется при удалении).

Итак, основная идея реализована и отлично работает. Я пытаюсь понять, как я определяю и публикую основной API приложений (который может быть реализован любым плагином ). С другой стороны, я не понимаю, как разработчики пакетов могут получить доступ к этой информации API?

Для того, чтобы разработчик пакета мог использовать API, им нужен какой-то SDK?

ответ

0

Одним из подходов было бы установить свойство запуска оболочки Constants.FRAMEWORK_BUNDLE_PARENT для вашего загрузчика классов приложений и свойства запуска рамки Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA в список пакетов, которые вы хотите открыть для плагинов. Затем плагины будут использовать Import-Package в своем манифесте пакета для пакетов вашего приложения так же, как и любой другой пакет.

+0

Это связывает два приложения вместе во время выполнения, чтобы плагины могли обращаться к API-интерфейсу ядра, который я хочу открыть. Однако я все еще не понимаю, как это помогает во время разработки? Вы не можете написать 'import com.parent.some.package.Class;' в плагине и ожидать, что IDE импортирует этот класс, если это не зависимость. Вы не можете либо сделать основное приложение зависимым от плагина, а затем разоблачить больше, чем только требуемый API. Я чувствую, что должен предоставить SDK, который разработчик плагина использует в качестве зависимости? – tarka

+0

@tarka Я не знаю, какую проблему вы пытаетесь решить в среде IDE. Вы пытаетесь помешать людям случайно в зависимости от классов, отличных от API, которые являются частью вашего JAR приложения? Тогда обязательно, только JAR API для плагинов для компиляции (это то, что вы подразумеваете под «SDK»?) Может работать, или просто документировать, какие авторы плагинов должны использовать. Они будут либо следовать документам, и их плагин будет работать, либо они будут использовать то, что им не нужно, и OSGi заблокирует их во время выполнения. –

+0

В настоящее время сценарий состоит в том, что имеется 2 отдельных JAR; приложение основного хоста и полностью отдельный комплект OSGi. Во время выполнения пакет OSGi регистрируется хост-приложением, а хост предоставляет методы API для пакета. Однако, когда я разрабатываю пакет, он не регистрируется на хосте. Его независимый набор классов. Итак, как вы узнаете об этом API-интерфейсе хоста в среде IDE, чтобы я мог «импортировать» классы API-интерфейса хоста в классы пакетов? – tarka