2013-03-07 6 views
0

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

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 

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

ответ

5

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

+0

Спасибо. Поэтому я должен написать в своем пакете Impl 'Export-Package: c.api; version =" 1.0.0.SNAPSHOT " Import-Package: org.osgi.framework; version =" [1.5,2) "и сохранить' c.api' otside bundles. Я прав? –

+1

№. Убедитесь, что C находится на обычном пути Java-класса (тот же, что и ваша инфраструктура). Затем при запуске фреймворка вы устанавливаете свойство org.osgi.system.packages.extra (пожалуйста, проверьте это имя) с пакетом C. Затем пакет должен импортировать этот пакет. –

+0

Большое спасибо. Он работает сейчас. –

Смежные вопросы