Использование сервисов от Embedded OSGi Framework

У меня есть встраиваемый Феликс. У меня есть некоторые API и Impl. Интерфейс экспорта API C.Impl импортирует этот интерфейс и регистрирует impl в активаторе. Теперь я хочу получить C Impl от OSGi

  FrameworkFactory ff = new FrameworkFactory();
  ...
  BundleContext bc = fwk.getBundleContext();
  ...
  final ServiceReference[] serviceReferences = bc.getServiceReferences(C.class.getName(), "(objectclass=" + C.class.getName() + ")");
  for(ServiceReference serviceReference : serviceReferences){
     final Object service = bc.getService(serviceReference);
     ...
  }

Теперь я хочу с ним взаимодействовать. Я могу сделать это с отражением

     System.out.println(service.getClass().getMethod("some").invoke(service)); //using 

Но я не могу бросить это

     System.out.println(service instanceof C); //prints false

Я думаю, что это происходит от разных ClassLoaders. Но как я могу это решить? Как мы можем взаимодействовать с контекстом OSGi извне? Или мы можем поместить все это в контейнер OSGi?

1 ответ

Решение

Если вы встраиваете OSGi, API для службы (т. Е. Интерфейс "C") должен быть видимым для внешнего приложения и экспортироваться в OSGi через экспорт системных пакетов. Внешнее приложение не может импортировать пакеты из пакетов, содержащихся в платформе OSGi.

Другие вопросы по тегам