Uso de Service Component Runtime

El objective es eliminar las dependencias en OSGi de mis paquetes. Yo uso felix (v 4.2.1) como implícito y lo ejecuto incrustado. Instalo el paquete org.apache.felix.scr (v. 1.6.2) para tener soporte de Service Component Runtime. Pero cuando corro

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

Obtengo la ClassCastException: org.apache.felix.scr.impl.ComponentRegistry cannot be cast to org.apache.felix.scr.ScrService .

Bueno. Voy a modificar los paquetes del sistema.

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

Ahora me sale

 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 

¿Cómo puedo resolverlo?

Sospecho que su primer bloque en el que intenta obtener ScrService está en el lado de incrustación (es decir, fuera del marco, no desde un paquete instalado).

Si este es el caso, entonces tiene dos copias del ScrService : una cargada desde el ClassLoader de su código de incrustación y una cargada por ClassLoader del paquete scr cuando el marco lo resuelva. Es por esto que estás viendo la ClassCastException .

Solo puede exportar lo que exporta el paquete SCR desde el paquete de infraestructura.

La Sección 3.8, página 51 de OSGi Core spec v5 indica que, en la resolución del cableado del paquete, si un módulo tiene definiciones de importación y exportación del mismo paquete, el marco intentará resolverlo externamente y, si tiene éxito, descartará la definición de exportación superpuesta.

Así que copie el encabezado de manifiesto Export-Package del paquete de tiempo de ejecución de SCR como una propiedad de marco:

 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 loader = ServiceLoader.load(FrameworkFactory.class); Iterator iterator = loader.iterator(); Framework framework = iterator.next().newFramework(properties); framework.start(); 

Un par de cosas a anotar:

  • Si aún no está utilizando ConfigurationAdmin , instale también org.osgi.compendium para asegurarse de que tiene al menos las clases de API para org.osgi.service.cm.* Y org.osgi.service.metatype* , AFAIK, estos son necesario para el tiempo de ejecución de SCR.

  • No debe usar Constants.FRAMEWORK_SYSTEMPACKAGES SISTEMA, a menos que esté personalizando seriamente el marco real, en su lugar, probablemente querrá usar Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA para extender lo que el paquete del marco exporta. (Las implementaciones de framework tienen valores predeterminados bastante buenos para FRAMEWORK_SYSTEMPACKAGES y normalmente no es necesario modificar esto al incrustar).