Доступ к контексту пакета OSGI в приложении

Я пытаюсь получить доступ к контексту пакета OSGI в приложении Java для получения работающей службы.

ctx.getServiceReference(ReceiverService.class.getName());

Я пробовал с этим:

BundleContext ctx = FrameworkUtil.getBundle(ReceiverService.class).getBundleContext();

но возвращает ноль

Я запускаю Knopflerfish в графическом режиме с предустановленными пакетами и запускаю пакет SenderSevice и пакет ReceiveService. Я хочу получить доступ к ReceiveService для использования полученных объектов в приложении Java. Поэтому мне нужен доступ к контексту пакета ReceiveService.


person user2992151    schedule 18.11.2013    source источник


Ответы (2)


Откуда загружается интерфейс ReceiveService? Он экспортируется из пакета? К сожалению, системный пакет не может импортировать пакеты из обычных пакетов.

Поскольку вы встраиваете OSGi и взаимодействуете с точки зрения служб между внешним приложением и внутренней структурой, пакеты интерфейсов должны быть загружены внешним приложением и экспортированы с использованием свойства org.osgi.framework.system.packages.extra. Это свойство передается через Карту, которую вы предоставляете FrameworkFactory.newFramework(). Затем обычные пакеты могут импортировать интерфейс службы и опубликовать службу.

Чтобы получить доступ к BundleContext из внешнего приложения, вы должны использовать метод getBundleContext() для объекта Framework. Это возвращает BundleContext системного пакета.

person Neil Bartlett    schedule 18.11.2013
comment
Спасибо за ваш ответ, тогда мне нужно встроить Osgi в свое приложение с помощью FrameworkFactory.newFramework(). Если я использовал это, я зарядил новую платформу, есть ли способ зарядить другую настроенную платформу Knopflerfish, или мне нужно установить все пакеты в новой среде? - person user2992151; 19.11.2013
comment
Я не понимаю вопроса. - person Neil Bartlett; 19.11.2013
comment
Извините, я постараюсь выразиться лучше. Теперь я запускаю knopflerfish в графическом режиме, поэтому я уже установил пакеты. Если я использую FrameworkFactory.newFramework(), у меня не будет установлен ни один пакет. Есть ли способ зарядить конфигурацию другого Knopflerfish (графический режим), или мне придется снова устанавливать все связки в java-приложении? - person user2992151; 19.11.2013
comment
Если вы запустите фреймворк с тем же каталогом хранилища (свойство org.osgi.framework.storage), то он запустится с тем же набором пакетов в том же состоянии. - person Neil Bartlett; 19.11.2013

Кажется, вы используете фреймворк OSGi, встроенный в приложение Java — как вы запустили этот фреймворк?

Стандартный способ будет

Framework framework = FrameworkFactory.newFramework(props);

Затем вы можете получить контекст системного пакета из экземпляра framework:

BundleContext ctx = framework.getBundleContext();

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

person Harald Wellmann    schedule 18.11.2013
comment
Я запускаю Knopflerfish в графическом режиме с предустановленными пакетами и запускаю пакет SenderSevice и пакет ReceiveService. Я хочу получить доступ к ReceiveService для использования полученных объектов в приложении Java. Поэтому мне нужен доступ к контексту пакета ReceiveService. Это верный путь? - person user2992151; 18.11.2013