Включение JAR в пакет OSGi с помощью maven-bundle-plugin
Я пытаюсь встроить некоторые JAR в один комплект OSGi, используя функцию maven-bundle-plugin
Меня беспокоит то, что все пакеты встроенных JAR помещаются в заголовок Import-Package сгенерированного файла MANIFEST.MF.
Если я укажу явно использовать только нужные мне пакеты, как в следующем фрагменте:
Import-Package: org.osgi.framework
Сбой сборки с ошибкой BND (неразрешенные ссылки).
Итак, вопрос здесь в том, как я могу построить пакет со встроенными JAR с заголовком "Import-Package", который мне нужен?
Ответы
Ответ 1
Все пакеты, импортированные в ваши классы, будут импортированы bnd. Возможно, вы не хотите, чтобы эти пакеты импортировались, потому что вы знаете, что во время выполнения вам не понадобятся. Если вы не можете остановить bnd от их импорта, вы можете сделать их необязательными, чтобы ваш пакет все равно разрешался, даже если они не были предоставлены другим пакетом (во время проводки). Попытайтесь добавить это:
<Import-Package>*;resolution:=optional<Import-Package>
В конфигурацию maven bnd в maven.
Ответ 2
Одна возможная причина, по которой вы видите "неожиданные" пакеты в заголовке Import-Package, следующая:
Общей практикой, поддерживающей модель совместной работы в OSGi, является импорт всех экспортируемых вами пакетов - см. этот пост в блоге от Peter Kriens для подробное объяснение почему. Bnd (и, следовательно, также maven-bundle-plugin) следует этой практике по умолчанию и автоматически импортирует все экспортированные пакеты. Поэтому сначала проверьте свой заголовок Export-Package и убедитесь, что вы экспортируете только нужные вам пакеты.
Также, если вы хотите экспортировать пакеты из встроенных зависимостей, тогда вы должны быть осторожны, чтобы избежать дублирования внутри вашего пакета - см. раздел Встраиваемая зависимость и экспорт- Пакет документации maven-bundle-plugin.
Ответ 3
Вы должны использовать Bundle-ClassPath, если хотите сделать классы доступными внутри пакета, содержащего JAR, например.
Bundle-ClassPath: foo.jar,other.jar
Import-Package: org.osgi.framework,org.other.imported
Вам нужно будет указать классы, которые импортируют/используют foo.jar и other.jar, но вам не нужно будет перечислять какие-либо пакеты в файлах foo.jar или other.jar, если вы их не экспортируете.
Ответ 4
Вы можете удалить некоторые пакеты из области импорта-пакета, когда встраиваете JAR в свой пакет:
<Import-Package>![package_name9]<Import-Package>
внутри pom.xml или если вы используете внешние *.bnd файлы:
Import-Package: ![package_name]