Как я могу получить пакет с учетом его символического имени?

#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.3 ResolverHook был добавлен API, который позволяет нам настраивать и фильтровать способ разрешения пакетов, например, для создания составных приложений с подсистемами. В этом сценарии может быть возможно, что могут быть установлены два пакета с одинаковым BSN и версией, например, в двух разных «регионах». Но это расширенный вариант использования.


Ответ №2:

Я никогда не видел примера того, как это сделать. Но есть PackageAdmin сервис, может быть, вы хотите взглянуть на это, но, похоже, он устарел. Пакет замены org.osgi.framework.wiring , похоже, не предоставляет такого метода.

И чтобы уточнить: какова ваша цель иметь экземпляр пакета?