Регистрация сервисов внутри пакетов расширений OSGi

Я играю с пакетами расширений фреймворка OSGi, чтобы полностью понять их. Посмотрев на спецификацию OSGi R6 ( 3.15 и 4.2.4.1), я успешно вызвал метод "start" ExtensionBundleActivator, Сейчас я пытаюсь зарегистрировать сервис внутри такого активатора. Однако, когда я пытаюсь использовать такой сервис, справочная аннотация не может подключить сервис.

Вот мой код (я изменил название пакета, но это не должно иметь значения):

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. Я использую Felix в качестве реализации OSGi;
  2. "ExtensionBundleExample" и "BundleExample" загружаются в папку автообработки в felix (по умолчанию это "bundle", но я настроил config.properties использовать папку "corebundles";
  3. Вывод корректно покажет "Запустите расширение связки активатора!" но когда пришло время показать ссылку actualBundleExample, вывод показывает "ноль";
  4. необязательный кардинал BundleExample используется для тестирования целей: я просто хотел вызвать метод "acivator", который есть у потребительского компонента (чтобы увидеть System.out.println приставка;
  5. Исходя из моего предыдущего вопроса, я понимаю, что пакеты расширения - это ниша внутри платформы OSGi, но я все же хочу их понять: я нахожу отсутствие примеров в Интернете по этой теме довольно раздражающим;

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

1 ответ

Решение

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

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

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

Просто предположение.

Другие вопросы по тегам