Использование сервисов от 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.