Использование среды выполнения сервисного компонента

Моя цель - удалить зависимости от OSGi из моих пакетов. Я использую felix (v 4.2.1) в качестве реализации и запускаю его встраиваемым. Я устанавливаю пакет org.apache.felix.scr (v. 1.6.2), чтобы иметь поддержку среды выполнения сервисных компонентов. Но когда я бегу

 ServiceReference ref = bundleContext().getServiceReference(ScrService.class.getName());
 ScrService s = (ScrService) bundleContext().getService(ref);

Я получаю ClassCastException: org.apache.felix.scr.impl.ComponentRegistry cannot be cast to org.apache.felix.scr.ScrService.

Хорошо. Я изменю системные пакеты.

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.apache.felix.scr");

Теперь я получаю

Caused by: org.osgi.framework.BundleException: Unresolved constraint in bundle org.apache.felix.scr [1]: Unable to resolve 1.0: missing requirement [1.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.4.0)(!(version>=2.0.0)))
        at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
        at com.copyright.rup.communications.felix.Felix.addBundle(Felix.java:86)
        ... 28 more

Как я могу это решить?


person Stan Kurilin    schedule 22.04.2013    source источник


Ответы (1)


Я подозреваю, что ваш первый блок, в котором вы пытаетесь получить ScrService, находится на стороне встраивания (т.е. вне фреймворка, а не внутри установленного пакета).

Если это так, то у вас есть две копии ScrService — одна загружается из ClassLoader вашего кода внедрения, а другая загружается ClassLoader пакета scr, когда он разрешается фреймворком. Вот почему вы видите ClassCastException.

Вы можете просто экспортировать то, что пакет SCR экспортирует из пакета фреймворка.

Раздел 3.8, стр. 51 OSGi Базовая спецификация v5 указывает, что при разрешении связывания пакетов, если модуль имеет определения импорта и экспорта одного и того же пакета, платформа сначала попытается выполнить внешнее разрешение и, в случае успеха, отбросить перекрывающееся определение экспорта.

Поэтому скопируйте заголовок манифеста Export-Package пакета среды выполнения SCR в качестве свойства фреймворка:

properties.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, 
        "org.ops4j.pax.url.mvn,org.apache.felix.scr;uses:=\"org.osgi.framework," +
        "org.osgi.service.component\";version=\"1.7\"," +
        "org.apache.felix.scr.component;status=provisional;mandatory:=status;" +
        "uses:=\"org.osgi.service.component\";version=\"1.0\"," +
        "org.osgi.service.component;uses:=\"org.osgi.framework\";version=\"1.2\"");

//Which you pass to the FrameworkFactory ...

ServiceLoader<FrameworkFactory> loader = ServiceLoader.load(FrameworkFactory.class);
Iterator<FrameworkFactory> iterator = loader.iterator();
Framework framework = iterator.next().newFramework(properties);
framework.start();

Несколько замечаний:

  • Если вы еще не используете ConfigurationAdmin, установите также org.osgi.compendium, чтобы убедиться, что у вас есть как минимум классы API для org.osgi.service.cm.* и org.osgi.service.metatype*, насколько я знаю, они необходимы для среды выполнения SCR.

  • Вы не должны использовать Constants.FRAMEWORK_SYSTEMPACKAGES, если только вы серьезно не настраиваете фактическую платформу, вместо этого вы, вероятно, захотите использовать Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA для расширения того, что экспортируется пакетом платформы. (Реализации фреймворка имеют довольно хорошие значения по умолчанию для FRAMEWORK_SYSTEMPACKAGES, и обычно нет необходимости изменять это при встраивании).

person earcam    schedule 22.04.2013
comment
Чтобы немного прояснить, что вызвало ошибку разрешения во второй части вопроса... с помощью FRAMEWORK_SYSTEMPACKAGES он удалил ВСЕ экспорты системных пакетов, кроме org.apache.felix.scr. Итак, пока, org.osgi.framework... пока, пока, javax.*... вы поняли. Использование FRAMEWORK_SYSTEMPACKAGES_EXTRA должно исправить это. - person Neil Bartlett; 22.04.2013
comment
Спасибо. Вы мне очень помогли. - person Stan Kurilin; 23.04.2013