Я играю с пакетами расширения инфраструктуры OSGi, чтобы их полностью понять. После просмотра спецификации OSGi R6 (3.15 and 4.2.4.1) Я успешно применил метод «start» для ExtensionBundleActivator
. Теперь я пытаюсь зарегистрировать службу внутри такого активатора. Однако, когда я пытаюсь использовать такую услугу, эталонная аннотация не может подключить услугу.Регистрация служб внутри комплектов расширения OSGi
Вот мой код ('в изменил название пучка, но это не имеет значения):
public class ExtensionBundleActivator implements BundleActivator {
@Override
public void start(BundleContext context) throws Exception {
System.out.println("start extension bundle activator!");
context.registerService(
BundleExample.class.getName(),
new BundleExampleImpl(),
new Hashtable<>(new HashMap<>()));
}
@Override
public void stop(BundleContext context) throws Exception {
//service automatically unregistered
}
}
И вот манифест такого расширения пучка:
Manifest-Version: 1.0
Bnd-LastModified: 1476436248622
Build-Jdk: 1.8.0_91
Built-By: massi
Bundle-ClassPath: .
Bundle-ManifestVersion: 2
Bundle-Name: extensionbundleexample
Bundle-SymbolicName: com.massimobono.microsi.extensionbundleexample
Bundle-Version: 0.0.1.SNAPSHOT
Conditional-Package: com.massimobono.microsi.common.*;
Created-By: Apache Maven Bundle Plugin
ExtensionBundle-Activator: com.massimobono.microsi.bundleexample.imp
l.ExtensionBundleActivator
Fragment-Host: system.bundle; extension:=framework
Provide-Capability: osgi.service;objectClass:List<String>="com.massimobo
no.microsi.bundleexample.BundleExample"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/com.massimobono.microsi.bundleexample.im
pl.ExtensionBundleExample.xml
Tool: Bnd-3.0.0.201509101326
Потребляющие расслоение (входит в комплект):
@Reference(cardinality=ReferenceCardinality.OPTIONAL)
public BundleExample actualBundleExample;
@Activate
public void activate() {
System.out.println("activating " + this.getClass().getSimpleName() + "with actual bundle set to "+ this.actualBundleExample);
}
Мой вопрос: Что же я делать не так? Почему потребитель не может обнаружить зарегистрированную услугу пакета расширения? Или, может быть, я просто делаю что-то, что запрещает рамки ... в этом случае невозможно предоставить услугу из пакета расширения? Как я могу взаимодействовать с кодом в комплекте расширения (например, получить доступ к чему-либо внутри самого пакета расширения)?
Вот некоторые примечания:
- Я использую Феликс как реализации OSGi;
- И «ExtensionBundleExample» и «BundleExample» загружаются внутри автоматического процесс папки Феликса (по умолчанию один является «расслоение», но я подправил
config.properties
использовать «corebundles» папку; - Выхода corretly показать «старт активатор пучка добавок! », но когда пришло время отобразить ссылку
actualBundleExample
, на выходе отображается« null »; - необязательная мощность BundleExample используется для тестирования целей: я просто хотел вызвать метод« acivator »для потребительского компонента имеет (для того, чтобы увидеть консоль
System.out.println
; - от моего предыдущего question Я понимаю, что комплекты расширения - это он внутри рамки OSGi, но я хочу понять их тем не менее: я нахожу отсутствие примеров в Интернете по поводу этой темы, весьма раздражающей;
Спасибо за любой ответ!
Добавление «com.massimobono.bundleexample» в записи «org.osgi.framework.system.packages.extra» в Felix config.properties решило проблему. Большое спасибо! (Кстати, кроме этого мне также не нужно было включать пакет, предоставляющий «com.massimobono.bundleexample» из тех, которые были развернуты в рамках ... о, хорошо!) – Koldar