Управление зависимостями с OSGi

Я хочу разработать многомодульное приложение в соответствии со спецификацией OSGi. Предположим, что один из моих модулей использует Apache Commons Logging 1.1.1. Spring предоставляет связанную версию Apache Commons Logging 1.1.1 в своем репозитории, поэтому я могу добавить соответствующую зависимость в свой POM.

Если я установлю свой пакет, например, в Apache Felix, правильно ли, что зависимость от Apache Commons Logging 1.1.1 не будет разрешена, пока я не установлю пакет Apache Commons Logging 1.1.1? Мой пакет попытается импортировать пакет, который не был экспортирован.

Я не совсем понимаю, как работает управление зависимостями в мире OSGi. Должен ли я устанавливать каждый пакет, который нужен моему приложению? Кроме того, я не понимаю, как он интегрируется с Maven?

Заранее спасибо за ваши пояснения


EDIT: я видел, что существует подпроект Apache Felix под названием OBR, который, кажется, облегчает управление пакетами (например, развертывание). Но у нас уже есть архитектура Maven с локальными репозиториями, частными репозиториями... Как OBR интегрируется в Maven?


person Mickael Marrache    schedule 11.07.2012    source источник


Ответы (2)


Если вы хотите использовать OSGi вместе с maven, я рекомендую Apache Karaf в качестве сервера, который может использовать структуру Felix OSGi. Преимущество заключается в том, что вы можете устанавливать пакеты непосредственно из репозиториев maven, используя URL-адреса mvn:.

Если вы просто используете Apache Karaf с репозиторием maven, у вас нет транзитивного разрешения во время выполнения. Вы должны установить все необходимые пакеты. Что очень помогает, так это то, что у karaf есть концепция функций. Таким образом, вы можете использовать функции в качестве крупнозернистых строительных блоков. Вы также можете создавать свои собственные функции, ссылаясь на другие функции и пакеты. Это позволяет установить все ваше приложение с помощью одной команды.

Felix и Karaf также поддерживают OBR, но вам придется создать свой собственный репозиторий OBR. В настоящее время нет общедоступных репозиториев OBR. Преимущество OBR в том, что он может разрешать большинство транзитивных зависимостей. Функции Karaf даже работают вместе с OBR, поэтому вы можете просто перечислить некоторые пакеты верхнего уровня в этой функции, а OBR разрешит остальное.

На практике у меня есть хороший опыт работы с простыми функциями Karaf без OBR. Это некоторая ручная работа, но меньше, чем вы ожидаете, и работает довольно хорошо.

person Christian Schneider    schedule 11.07.2012

Зависимости OSGi основаны на пакетах Java: когда пакет заявляет, что ему необходимо импортировать данный пакет (с указанием диапазона допустимых версий), инфраструктура попытается «связать» этот импорт с подходящей версией этого пакета, который должны быть экспортированы другим пакетом.

Если пакет не может быть найден, пакет не будет разрешен и не может быть запущен, поэтому да, вам нужно будет установить все пакеты, которые требуются вашему приложению, и, как указывает Кристиан, существуют различные инструменты, которые могут вам в этом помочь.

Простой способ получить необходимые пакеты — использовать плагин maven-dependencies-plugin, чтобы получить пакеты из списка зависимостей Maven и скопировать их куда-нибудь, где ваше приложение может найти их при запуске, чтобы установить их, как это сделано в [2] (в launcher/pom.xml), небольшой пример приложения, который я написал.

Вы также можете использовать плагин Sling maven-launchpad-plugin [3] для создания исполняемого jar-файла, который включает в себя инфраструктуру OSGi и все необходимые вам пакеты и настраивает все при запуске.

Об импорте и экспорте - не вдаваясь в подробности, предполагая, что вы используете maven-bundle-plugin [1] для сборки своих пакетов, вы укажете, какие пакеты вы хотите, чтобы ваш пакет экспортировал (другие будут невидимы для других пакетов), и maven-bundle-plugin сгенерирует (в большинстве случаев автоматически, но вы можете переопределить это по мере необходимости) список пакетов для импорта, поэтому обычно не так много работы, если ваш собственный код четко разделен между пакетами, которые вы хотите экспортировать и пакеты внутренней реализации.

[1] http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html

[2] https://github.com/bdelacretaz/OSGi-for-mere-mortals< /а>

[3] http://sling.apache.org/site/maven-launchpad-plugin.html

person Bertrand Delacretaz    schedule 12.07.2012