Pregunta

He arreglado para iniciar Apache Felix de código y registrar un propio paquete.

Se necesita siguiente relación entre OSGI-proyectos:

[OsgiInterface] -. Proporciona interfaces

[OsgiModuleA] - (bundle) proporciona una implementación de esas interfaces
. sabe [OsgiInterface]

[OsgiUsage] - hace uso de uno o más paquete
. sabe [OsgiInterface] y [OsgiModuleA]

Ahora tengo problemas con el registro de un servicio que implementa una interfaz. Me imagino que mis entradas en los archivos manifest.mf están equivocados.

Información adicional

Sería muy amable, si alguien puede mirar el código en mi pregunta anterior

Me referiré a esta pregunta:

He intentado crear un tercer Proyecto OsgiInterfaces , que proporciona una interfaz de SomeInterface en el interfaces paquete. Este proyecto es conocido tanto por OsgiModuleA y OsgiUsage .

OsgiModuleA: manifest.mf tiene ahora un interfaces adicional valor para el Import-Package: entrada. Además, hay una instancia de SomeInterface proporcionado al activador.

Cuando se inicia el paquete, un NoClassDefFoundError se produce:. La SomeInterface interfaz no se conoce

EDIT:

Ahora, que el error es fijo, puedo decir, que la parte más importante fue:

map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
    "my.interfaces; version=1.0.0");

Sin esto, tengo ClassCastException.

¿Fue útil?

Solución

En la forma más básica, los servicios están registrados en código Java, no usar manifiesto o cualquier otro archivo. Esto suele suceder en su BundleActivator.

Long      i     = new Long(20);    // the service implementation
Hashtable props = new Hashtable();
props.put("description", "This an long value");
bundleContext.registerService(Long.class.getName(), i, props);

Le sugiero que lea un tutorial, como el de Knopflerfish

Una alternativa es usar Servicios declarativa, o la nueva instalación Blueprint. El uso de cualquiera de estos (u otros sistemas no estandarizados) va a declarar sus servicios en un archivo (normalmente XML), en lugar de escribir código para interactuar con el registro de servicios.

Pero probablemente debería averiguar los fundamentos manualmente primero.

  

[OsgiUsage] - hace uso de uno o más paquete.   sabe [OsgiInterface] y [OsgiModuleA]

No debería ser necesario que el paquete que utiliza un servicio de saber sobre el paquete que se ofrece. Ambos sólo tiene que saber la interfaz de servicio. De hecho, los paquetes no deberían necesitar saber acerca de otros paquetes en absoluto. Lo único que necesitan para importar paquetes y consumir o prestación de servicios.

Otros consejos

Yo entiendo que usted tiene SomeInterface en otro paquete, ¿verdad? A continuación, también debe exportar ese paquete en el manifiesto de ese paquete, por ejemplo.

Export-Bundle: interfaces

Pero realmente debería echar un vistazo a la herramienta BND mencionado en otra respuesta. Esto genera manifiestos OSGi estándar.

Le sugiero que busque en el proyecto iPOJO. Este maquillaje usando Felix mucho más fácil.
https://felix.apache.org/documentation/subprojects/apache- Felix-ipojo.html

Yo diría que el uso BND directa o maven-haz-plugin para crear frascos OSGi habilitados.

Es más fácil que escribir el OSGi manifiesta a sí mismo (errores tipográficos, errores, importaciones / exportaciones desaparecidos)

El intentar envolver los tarros con BND como punto de partida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top