У меня есть встроенный 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?
Спасибо. Поэтому я должен написать в своем пакете Impl 'Export-Package: c.api; version =" 1.0.0.SNAPSHOT " Import-Package: org.osgi.framework; version =" [1.5,2) "и сохранить' c.api' otside bundles. Я прав? –
№. Убедитесь, что C находится на обычном пути Java-класса (тот же, что и ваша инфраструктура). Затем при запуске фреймворка вы устанавливаете свойство org.osgi.system.packages.extra (пожалуйста, проверьте это имя) с пакетом C. Затем пакет должен импортировать этот пакет. –
Большое спасибо. Он работает сейчас. –