2016-10-14 1 views
0

Я играю с пакетами расширения инфраструктуры 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); 
} 

Мой вопрос: Что же я делать не так? Почему потребитель не может обнаружить зарегистрированную услугу пакета расширения? Или, может быть, я просто делаю что-то, что запрещает рамки ... в этом случае невозможно предоставить услугу из пакета расширения? Как я могу взаимодействовать с кодом в комплекте расширения (например, получить доступ к чему-либо внутри самого пакета расширения)?

Вот некоторые примечания:

  1. Я использую Феликс как реализации OSGi;
  2. И «ExtensionBundleExample» и «BundleExample» загружаются внутри автоматического процесс папки Феликса (по умолчанию один является «расслоение», но я подправил config.properties использовать «corebundles» папку;
  3. Выхода corretly показать «старт активатор пучка добавок! », но когда пришло время отобразить ссылку actualBundleExample, на выходе отображается« null »;
  4. необязательная мощность BundleExample используется для тестирования целей: я просто хотел вызвать метод« acivator »для потребительского компонента имеет (для того, чтобы увидеть консоль System.out.println;
  5. от моего предыдущего question Я понимаю, что комплекты расширения - это он внутри рамки OSGi, но я хочу понять их тем не менее: я нахожу отсутствие примеров в Интернете по поводу этой темы, весьма раздражающей;

Спасибо за любой ответ!

ответ

2

Основная цель расширительных пакетов - это расширение каркаса, абсолютно не для регулярного использования. То есть пакеты расширения часто тесно связаны с каркасом. Причина в том, что многие правила не учитываются для пакетов расширения, поскольку они находятся на «неправильной» стороне забора. Есть несколько примеров по очень веским причинам. Вы не должны использовать их, если не знаете, что делаете, потому что большинство правил OSGi не применяются.

указано. Я ожидаю, что пакет, который вы используете для BundleExample, отличается между комплектом расширения (происходит из пути класса) и примером DS, экспортированным некоторым пакетом. Поскольку они исходят от разных загрузчиков классов, OSGi считает их разными службами, потому что при попытке использовать его вы получите исключение загрузчика класса.

Вы можете решить это, предоставив инфраструктуре экспортировать этот пакет.

Просто догадаться.

+0

Добавление «com.massimobono.bundleexample» в записи «org.osgi.framework.system.packages.extra» в Felix config.properties решило проблему. Большое спасибо! (Кстати, кроме этого мне также не нужно было включать пакет, предоставляющий «com.massimobono.bundleexample» из тех, которые были развернуты в рамках ... о, хорошо!) – Koldar

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