#java #osgi
#java #osgi
Вопрос:
Документация для BundleContext
говорит, что это позволяет вам
- Получите список пакетов, установленных в Фреймворке.
- Получите объект Bundle для пакета.
Однако нет никакого getBundle(String symbolicName)
метода, только getBundle(long id)
(и то неподходящего getBundle(String location)
. Конечно, можно вызвать getBundles()
и выполнить итерацию по возвращаемому массиву, но есть ли лучший способ?
Ответ №1:
Я думаю, что перебор по массиву getBundles()
— это нормально. Возможно, он вообще не должен существовать, потому что символическое имя не идентифицирует однозначно пакет. Может getBundles(String symbolicName)
быть …
Из спецификации ядра платформы обслуживания OSGi, выпуск 4, версия 4.3:
3.6.2 Bundle-SymbolicName
Заголовок
Bundle-SymbolicName
манифеста является обязательным заголовком. Символическое имя пакета и версия пакета идентифицируют уникальный пакет. Это не всегда означает, что эта пара уникальна в фреймворке, в некоторых случаях один и тот же пакет может быть установлен несколько раз в одном и том же фреймворке, см. Идентификаторы пакетов на стр. 89.
Упомянутая страница 89 (которая на самом деле является страницей 95):
4.4.1 Идентификаторы пакетов
[…]
Хотя пара уникальна, можно установить один и тот же пакет несколько раз, если
org.osgi.framework.bsnversion
для свойства запуска фреймворка установлено значение multiple .
Комментарии:
1. «в некоторых случаях один и тот же пакет может быть установлен несколько раз в одной и той же среде» Хороший момент, я об этом не подумал.
2. В этом предложении, я думаю, в спецификации говорится об установке jar с тем же символическим именем и тем же номером версии несколько раз. (Не устанавливать пакеты с одинаковым символическим именем, но с разными номерами версий.) Стоит проверить упомянутую главу 4.4.1.
3. Чтобы уточнить … до OSGi R4.3 пара
Bundle-SymbolicName
(BSN) и Bundle-Version всегда была уникальной. В 4.3ResolverHook
был добавлен API, который позволяет нам настраивать и фильтровать способ разрешения пакетов, например, для создания составных приложений с подсистемами. В этом сценарии может быть возможно, что могут быть установлены два пакета с одинаковым BSN и версией, например, в двух разных «регионах». Но это расширенный вариант использования.
Ответ №2:
Я никогда не видел примера того, как это сделать. Но есть PackageAdmin
сервис, может быть, вы хотите взглянуть на это, но, похоже, он устарел. Пакет замены org.osgi.framework.wiring
, похоже, не предоставляет такого метода.
И чтобы уточнить: какова ваша цель иметь экземпляр пакета?