¿Cuál es la mejor manera de agrupar paquetes OSGi para crear una 'aplicación' coherente?

La "manera OSGi" es desarrollar paquetes separados que contengan piezas de funcionalidad discretas y coherentes. A veces, estos paquetes contienen clases de utilidades, a veces dependen de clases de utilidades y configuran sus propios servicios OSGi.

Los usuarios, por otro lado, es poco probable que estén expuestos a paquetes. Se preocupan más por la solicitud en línea., una pieza de software que realiza una tarea o resuelve su problema. Normalmente, una aplicación utilizará varios paquetes (por ejemplo, importados a través de Import-Package) para realizar sus tareas.

¿Cuál es la mejor manera de formalizar esta relación en el mundo OSGi? Un requisito de ejemplo sería algo tan simple como mostrar el número de versión actual de la aplicación (no los paquetes) para el usuario. ¿Cómo se descubriría este número de versión?

Eclipse tiene un concepto llamado "características", pero no es el estándar OSGi.

Peter Kriens tiene escrito sobre aplicaciones OSGi y su artículo tiene sentido. Mi conclusión fue que una aplicación puede asignarse a un paquete; es solo que el paquete usa otros paquetes de alguna manera. Pero si uno va a crear un paquete de aplicaciones utilizando Import-Package, no veo cómo puede ser factible desde el punto de vista del desarrollo.

Una forma puede ser tener un 'paquete de aplicaciones' que use Require-Bundle y tenga su propia versión, pero Require-Bundle está mal visto en el mundo OSGi.

Sin embargo, usar Import-Package para importar todos los paquetes requeridos con las versiones requeridas agrega un importante gastos generales de mantenimiento para el desarrollador en la medida en que no creo que sea factible. Cada vez que se realiza el cambio más pequeño, incluso en un paquete de implementación, se debe actualizar la versión del paquete y luego se debe actualizar la dependencia de la versión del paquete en el 'paquete de la aplicación'.

preguntado el 04 de julio de 12 a las 10:07

3 Respuestas

El marco es la aplicación... En mi humilde opinión, el mayor error en el mundo de OSGi es ver a OSGi como un marco multiinquilino, no fue diseñado para ese propósito y no encaja bien. Dentro de un marco, hay una alta cohesión, todos los servicios registrados son tu servicios. El modelo arquitectónico de OSGi le permite escribir aplicaciones a partir de componentes poco acoplados cableados a través de servicios. Lo cual es, en mi humilde opinión, lo mejor que obtiene en software (aunque lamentablemente faltan muchos componentes, vendrán).

En bndtools hacemos todo lo posible para ayudar con este modelo. Un archivo bndtools bndrun es básicamente una aplicación que puede implementar. bnd puede convertir este archivo bndrun en Jar ejecutable con un encabezado de manifiesto de clase principal. (Y con JPM será fácil de implementar en cualquier sistema).

Entonces, el flujo de trabajo es básicamente: diseñar sus servicios (== arquitectura), encontrar componentes estándar, desarrollar componentes faltantes, probar los componentes, probar la integración y convertir todo en un JAR ejecutable (o WAR).

Obviamente, aún puede ejecutar múltiples marcos dentro de una sola VM si así lo desea, pero nunca ejecute diferentes aplicaciones no relacionadas en el mismo marco, no es una buena idea, la vida ya es bastante difícil.

Respondido 04 Jul 12, 18:07

Gracias, esa es una aclaración interesante e importante que no entendí antes. He leído sobre JPM en su blog y el concepto suena bien, básicamente lo estoy haciendo yo mismo en una colección profana de scripts de compilación e instaladores. Con ganas de ver cómo resulta. - Dan Gravel

Gracias Pedro. Ojalá fuera así. Pero con el surgimiento de Apache Karaf y Eclipse Virgo, un marco también contiene un servidor web, como Pax Web que incorpora Jetty, ejecutándose en un puerto. Ahora, debido a la forma de contenedor de servlet, parece lógico ejecutar dos o más aplicaciones web, en diferentes rutas de contexto. Lo que significa que estas aplicaciones deben residir en el mismo marco. La otra alternativa (que está más alineada con "todos los servicios son sus servicios") es ejecutar cada aplicación en una instancia de Karaf separada, puerto HTTP separado, etc. ¿Qué piensa usted? - hendy irwan

Hay tantas formas de despellejar a este gato en particular :-) La solución más simple es poner su marco OSGi en un WAR y usar cualquier servidor de aplicaciones. En segundo lugar, puede usar proxy fácilmente para el servicio HTTP. Esto puede variar desde dentro de un proceso con múltiples marcos (simplemente registre el servicio Http en todos los marcos cuando los inicie) hasta que cada ejecutable tenga su propio servidor HTTP (simple) en un puerto local que se fusiona con un servidor http robusto (que puede proporcionar una gran cantidad de buen almacenamiento en caché central, seguridad, otros idiomas, enrutamiento de URL y otras características listas para usar). - Pedro Kriens

Creo que la palabra que está buscando es 'subsistema', creo que hay un borrador de especificación OSGi. allí afuera.

Mi opinión personal:

Cree sus paquetes y guárdelos en algún lugar (por ejemplo, un servidor Sonatype Nexus, estoy bastante satisfecho con él, incluso tiene soporte para OBR y un soporte limitado para generar datos p2)

Una 'aplicación' es entonces una selección de paquetes con una determinada versión fuera de ese repositorio, que puede volver a versionar.

Todavía no existe un estándar real, creo que en este punto deberá elegir uno de los no estándar que existen. El costo de cambiar al estándar o incluso admitir varios no debería ser tan grande.

Estas diapositivas mencionarlos a todos

Respondido 04 Jul 12, 11:07

Gracias por presentar 'subsistemas'. Esa plataforma de diapositivas parece cubrir mis requisitos, por ejemplo, Subsystem-Version. Es interesante que 'Subsystem-Content' declare paquetes (y otras cosas) en lugar de paquetes. Desafortunadamente, Felix, mi impl OSGi de elección, no parece tener un concepto de subsistema. - Dan Gravel

Podría considerar Apache Karaf, que usa Felix debajo (aunque creo que también puede ejecutarse usando Equinox). Las características de Karaf son fáciles de usar y, por lo que puedo ver, más o menos lo que quieres. El uso de mvn:/ URL de estilo también es inteligente. - Frank Lee

Subsystems es muy nuevo (la especificación fue definitiva el mes pasado) y, por lo tanto, aún no encontrará implementaciones estables. Además, en mi humilde opinión, es demasiado complicado... ¿realmente está implementando varias aplicaciones aisladas en un solo marco OSGi? - Neil Bartlett

Sí, hay muchas disposiciones para diferentes casos de uso y granularidades allí. Realmente solo quiero agrupar algunos paquetes. - Dan Gravel

También recomiendo usar las funciones de karaf por ahora si usa Apache Karaf. También estamos trabajando para integrar la especificación del subsistema en Karaf. Por lo tanto, más tarde podría hacer la transición a la forma estándar. - Christian Schneider

Si usa un solucionador como OBR o el nuevo solucionador R5, entonces use Import-Package no crea necesariamente una gran sobrecarga de mantenimiento.

Sin embargo, a pesar de la Require-Bundle camino también es posible. Una "aplicación" generalmente consta de un pequeño número (digamos, 1-5) paquetes "interesantes". Luego está todo el resto, como dependencias, SCR, Blueprint, etc. Por lo tanto, podría crear un solo paquete de aplicaciones de nivel superior que use Require-Bundle para referirse al pequeño conjunto de paquetes interesantes, y luego todas las demás dependencias se especifican con Import-Package.

Respondido 04 Jul 12, 11:07

Entonces, ¿crees que este es un uso legítimo de Require-Bundle? Todas mis dependencias hasta ahora usan Import-Package porque he leído y entendido cuál es la mejor práctica. Pensé que la retención de Require-Bundle era principalmente soporte heredado para Eclipse. - Dan Gravel

Considero esto como un caso de uso legítimo para Require-Bundle, sí. Creo que Peter Kriens está de acuerdo. Básicamente, para las dependencias "reales" que provienen de sus clases de Java, siempre debe usar Import-Package.... pero aquí está creando una especie de dependencia falsa simplemente para ensamblar cosas en una aplicación. - Neil Bartlett

Creo que no hay nada 'malo' en Require-Bundle si realmente desea especificar una dependencia para un paquete. En cuanto a OBR, creo que su utilidad depende de cómo desee implementar sus actualizaciones. - Frank Lee

Eso es cierto, podrías usar Provide/Require-Capability en lugar de. - Neil Bartlett

Require-Bundle no es malo si el requirerer es una hoja (nadie depende de él). La maldad de Require-Bundle es causada por su naturaleza transitiva. Los componentes que requieren otros componentes crean el problema de la gran bola de lodo y básicamente acaban con la reutilización. Este problema es bien conocido en los sistemas Orientados a Objetos y se traduce directamente a los componentes. Los servicios/paquetes hacen exactamente lo que hicieron las interfaces para los objetos (aliviando el acoplamiento transitivo). - Pedro Kriens

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.