provided plugin management exclusion example dependency java maven-2 osgi dependency-management

java - plugin - ¿Cómo desplegar aplicaciones y dependencias OSGi?



maven dependency provided example (3)

Hay un aspecto fundamental de su pregunta que aún no se ha abordado.

Glassfish es de hecho un servidor de aplicaciones completo como la mayoría de los servidores de aplicaciones modernos: estos le proporcionan un contenedor web (donde desplegaría archivos WAR), un contenedor Java EE (para implementar EJB''s en archivos JAR y EAR), así como también integra Contenedor OSGI . Luego se usa para los propios mecanismos de inicio internos del servidor de aplicaciones.

En esencia, puedes apuntar a tres contenedores . Las herramientas IDE y de compilación modernas le brindan los medios para empacar su lógica para abordar cualquiera de estos. Entonces la pregunta es: ¿cómo puedo diseñar mi aplicación con todas esas posibilidades?

Hay algunas cuestiones técnicas muy importantes para no perder de vista. (Aquí me enfoco en consideraciones objetivas y objetivas, manteniéndome alejado de cualquier elección subjetiva, filosofía, estrategia y otras consideraciones dependientes del contexto que de hecho también pueden influir mucho en su decisión final):

  1. Un contenedor OSGI no le proporciona servicios de gestión de transacciones , persistencia o transacción implícitos o declarativos , como los contenedores Web y Java EE. Por lo tanto, planee analizar estos problemas y produzca el código para administrar sus subprocesos y lidiar con la propagación de transacciones sobre estos subprocesos, por ejemplo. Por supuesto, OSGi proporciona todas las API necesarias para lidiar con esos aspectos, pero requiere codificación (donde AOP puede ayudar). Por otro lado, en los contenedores Web y Java EE, usted confía en los servicios administrados por contenedor y / o utiliza anotaciones EJB, descriptores de implementación y objetos administrados por el servidor como grupos para simplemente declarar cuántos subprocesos desea en paralelo, el tamaño de conjuntos de conexiones, y qué atributos de transacción. Existen ventajas e inconvenientes en cualquiera de los estilos (procedimental en OSGi versus declarativo o implícito en la aplicación java. Servidores).
  2. OSGI proporciona una forma ordenada de cargar su código, administrar las dependencias de los módulos , incluso lidiar con múltiples versiones coexistentes del mismo módulo, y agregar / eliminar dinámicamente e iniciar / detener los llamados paquetes (unidades de implementación OSGI), siempre que su paquete contenga el Lógica para manejar posibles problemas de inicio / detención, como la interrupción adecuada de todos los subprocesos iniciados en una detención: subprocesos que podrían haberse "propagado" a través de otros módulos dependientes. Por otro lado, los contenedores Java EE y Web a menudo embarcarán copias de JAR dependientes que pueden generar implementaciones más complejas a menos que comience a considerar la jerarquía del cargador de clases de su servidor de aplicaciones y se aproveche para implementar ''bibliotecas compartidas'' como JJO de POJO. o como frijoles Java EE empaquetados en JAR''s. De todos modos, en los casos posteriores, la gestión de las dependencias de implementación se convierte en una preocupación que deberá abordar al menos en el momento de la construcción utilizando marcos como Maven. Luego, en el tiempo de ejecución, es posible que tenga que ejecutar secuencias de comandos de inicio / parada de acuerdo con las dependencias; de lo contrario, aproveche las extensiones de servidor de aplicaciones específicas que abordan estos problemas de implementación dinámica en contenedores Web y Java EE (por ejemplo, Weblogic).
  3. Como ya se dijo, la mayoría de los servidores de aplicaciones utilizan OSGI para administrar su propia secuencia de inicio . Con la creciente complejidad de las plataformas, la multiplicación de las API, el incremento en el número de equipos de desarrollo para ensamblar un único producto final, así como el uso de numerosos componentes de fuente abierta / de terceros, OSGI se convierte en una herramienta indispensable de inicio de servidor para garantizar Versiones estables y un conjunto coherente de versiones compatibles de todos los componentes. Piense en el IDE de Eclipse: con un catálogo de miles de complementos y una alta tasa de nuevos lanzamientos, este IDE sería una plataforma mucho más frágil sin OSGI como base. Los servidores de aplicaciones modernos enfrentan el mismo problema.
  4. En base a las consideraciones anteriores , puede sentirse muy tentado a colocar su código en algunas instalaciones que podría basar en la capa OSGI, que a su vez proporciona servicios centrales a una lógica empresarial de alojamiento de capa de bean Java EE, y luego una capa de servlet web para la interfaz el conjunto ... pero surgen otras dos preguntas: (a) ¿Cómo hace que todos estos componentes se comuniquen entre sí? OSGI tiene su propio mecanismo de repositorio y los API de JAR desplegados no serán visibles por otros módulos a menos que se publiquen explícitamente en OSGI. Los contenedores web y Java EE utilizan una tecnología de repositorio completamente diferente para acceder a las interfaces de cada uno de los componentes, a saber, JNDI. De nuevo, consulte la documentación de su servidor de aplicaciones específico que puede proporcionar medios para abordar los beans Java EE de los paquetes OSGI y viceversa (Glassfish, por ejemplo, desde V3); pero tenga cuidado con la gestión de hilos y los ámbitos de transacción. (b) ¿Cómo evitaría interferir en la secuencia de inicio del servidor de aplicaciones? OSGI tiende a convertirse en una característica central del sistema (bajo el gobierno del proveedor), en comparación con los contenedores de la Web y Java EE orientados naturalmente para alojar el código de su aplicación (bajo su gobierno). La actualización de su servidor de aplicaciones o la instalación de una nueva versión puede interferir con sus propias implementaciones OSGI; Tendrá que revisar el problema y organizar sus scripts de implementación como consecuencia.

La pregunta es rica y su análisis es complejo. La consideración adicional debe tener en cuenta la naturaleza de la aplicación para construir. Además, si tiene la intención de utilizar marcos de desarrollo como el código abierto Spring y / o Camel, así como los específicos de proveedores como los composites Oracle Fusion SOA, JBoss Switchyard, etc., tendrá que tener en cuenta muchas otras limitaciones técnicas.

No hay una respuesta de "talla única para todos" en estos asuntos y eso, en esencia, justifica la plétora actual de tecnologías superpuestas.

Cuando esa cuestión de arquitectura se resuelve por primera vez, puede buscar optimizar la productividad con un depósito de implementación y administración de configuración adecuado.

OSGi parece tener un excelente beneficio de tener pequeños artefactos desplegables al no incluir docenas de dependencias JAR en un directorio lib. Sin embargo, no puedo encontrar nada que me indique una manera fácil y confiable de implementar dependencias en un contenedor. Por ejemplo, tengo una aplicación que usa CXF y varios subproyectos de Spring. Si necesito implementar esta aplicación en un nuevo servidor Glassfish, ¿cuál sería la mejor manera de hacerlo, asegurando que todas las dependencias se instalen?

Estoy usando Maven, y parece que podría haber alguna forma de tener un enlace que busque en el directorio META-INF / maven y extraiga la lista de dependencias del pom.xml y vaya a buscar las librerías necesarias (probablemente de un repositorio local). ¿Hay una manera de hacer eso?

¿El plugin de Pax suena como si estuviera haciendo esto, pero parece estar basado en un contenedor de Felix? Lo que no es lo que quiero, estoy tratando con un contenedor remoto que ya está en ejecución.

¿Existe alguna posibilidad de que exista algo así como herramienta de línea de comandos en lugar de GUI?


Hay varias formas de implementar paquetes dependientes en contenedores OSGi. Éstos son algunos de ellos:

1 El repositorio del paquete Felix OBR

Primero debe crear un archivo de índice XML para sus paquetes disponibles, utilizando una herramienta como bindex. Si está utilizando el complemento de paquete de maven, entonces mantiene automáticamente un índice OBR en ~ / .m2 / repository / repository.xml.

Cargue el índice utilizando la interfaz de línea de comandos OBR:

> obr:addUrl file:/Users/derek/.m2/repository/repository.xml

Luego, solicite a OBR que implemente su paquete de destino, con las dependencias determinadas a partir del índice OBR:

> obr:deploy com.paremus.posh.sshd Target resource(s): ------------------- Paremus Posh Ssh Daemon (1.0.23.SNAPSHOT) Required resource(s): --------------------- Paremus Command API (1.0.23.SNAPSHOT) Optional resource(s): --------------------- Paremus Config Admin Commands (1.0.23.SNAPSHOT) Paremus OSGi & LDAP Types (1.0.23.SNAPSHOT)

2 Apache Karaf

Karaf admite "características", que son básicamente listas de paquetes necesarios para proporcionar la característica:

karaf@root> features:info obr Description of obr 2.0.0 feature ---------------------------------------------------------------- Feature has no configuration Feature has no dependencies. Feature contains followed bundles: mvn:org.apache.felix/org.apache.felix.bundlerepository/1.6.4 mvn:org.apache.karaf.shell/org.apache.karaf.shell.obr/2.0.0 mvn:org.apache.karaf.features/org.apache.karaf.features.obr/2.0.0 karaf@root> features:install obr

3 Eclipse Virgo

Virgo usa planes para definir los artefactos que componen una aplicación y puede suministrar automáticamente las dependencias de una aplicación, incluidos paquetes, planes, archivos de plan (PAR) y configuraciones, tanto de repositorios locales como remotos.

4 Paremus Nimble

Nimble utiliza los índices de repositorio OBR (o su propio extendido) para implementar automáticamente todos los paquetes dependientes necesarios para activar un paquete de destino (y los desinstala cuando se detiene el paquete de destino). También puede detectar otras dependencias, como que un paquete WAB requiere un extensor de web e instalar automáticamente una de acuerdo con una política configurable.

Nimble también se puede configurar para lanzar Glassfish, de modo que sus características estén disponibles para los paquetes en el contenedor de Glassfish.

El siguiente ejemplo también muestra que el soporte de registro se instala automáticamente cuando se activa sshd:

$ posh ________________________________________ Welcome to Paremus Nimble! Type ''help'' for help. [denzil.0]% nim:add --dry-run com.paremus.posh.sshd@active -- sorted parts to install -- 4325 osgi.resolved.bundle/ch.qos.logback.core:0.9.22 -- start dependency loop -- 5729 osgi.resolved.bundle/com.paremus.util.logman:1.0.23.SNAPSHOT 5727 osgi.active.bundle/com.paremus.util.logman:1.0.23.SNAPSHOT 3797 osgi.resolved.bundle/ch.qos.logback.classic:0.9.25.SNAPSHOT 3792 osgi.resolved.bundle/slf4j.api:1.6 -- end dependency loop -- 436 osgi.resolved.bundle/org.apache.mina.core:2.0.0.RC1 6533 osgi.resolved.bundle/sshd-core:0.3 398 osgi.resolved.bundle/com.paremus.posh.sshd:1.0.23.SNAPSHOT 396 osgi.active.bundle/com.paremus.posh.sshd:1.0.23.SNAPSHOT

(descargo de responsabilidad: soy un desarrollador en Paremus)

5 apache felix gogo

gogo es el nuevo shell estándar de línea de comandos RFC147. Ya se usa en Felix, Karaf, Nimble y pronto estará disponible en Glassfish.

Gogo le permite ejecutar cualquier comando que pueda escribir de forma interactiva, como un script. Por lo tanto, puede generar la lista de paquetes para instalarlos y convertirlos en una secuencia de comandos, o incluso capturar los paquetes instalados desde una configuración de trabajo para que se pueda volver a crear desde un inicio limpio.


Si creas una aplicación OSGi y una aplicación clásica de Java que hacen lo mismo y usan las mismas bibliotecas, necesitarás exactamente el mismo conjunto de archivos JAR. La gran diferencia es poder definir explícitamente sus dependencias (y posiblemente producir JAR más granulares para su aplicación).

Solo conozco un servidor basado en OSGi puro (Virgo de Eclipse, anteriormente servidor DM de Spring). Glassfish y Websphere tienen soporte para OSGi, pero no he jugado con ellos, así que no puedo decir mucho. Lo que puedo decir es que todos ellos requieren un contenedor OSGi y eso es generalmente Equinox de Eclipse o Felix de Apache.

Su pregunta parece ser realmente acerca del aprovisionamiento de la aplicación (averiguar qué se necesita implementar). Sé que para Maven 3.0 han hecho un montón de cosas trabajando con el marco de aprovisionamiento P2 de Eclipse.

Para su aplicación, ¿está implementando un EAR o WAR? Para cualquiera de estos, su sistema de compilación deberá producir el archivo con todas las dependencias o no funcionará. Es un poco confuso sobre por qué tiene un problema porque la gente usa Maven porque hace la gestión de dependencia transitiva para sus compilaciones.