2011-09-20 35 views
17

Así que esta tarde me tomé un tiempo para finalmente sentarme y comenzar a leer el misterioso y elusivo "OSGi" y sus llamados paquetes .¿Cuáles son las diferencias fundamentales entre OSGi y Java EE?

OK, entonces yo creo Lo entiendo. Un "paquete" de OSGi es básicamente un JAR con cierta información de manifiesto adicional. Y, en lugar de implementarlo en un servidor de aplicaciones normal (u otro contenedor), lo despliega en un servidor OSGi como Apache Felix. Se ejecuta y luego proporciona servicios a usuarios/clientes.

¿Cómo es esto diferente de un EAR normal que se implementa en un servidor de aplicaciones?

OSGi parece estar en aumento (¡Me sigo topando!), Pero por mi vida no entiendo lo que ofrece (a nivel de característica) sobre cualquier cosa que pueda hacer con la empresa real servidor como GlassFish o Spring.

Sé que el mundo no se ha vuelto loco, así que obviamente me falta algo. Simplemente no he podido averiguar qué. Gracias por cualquier ayuda o visión!

+0

Creo que si esto estuviera redactado como "¿Cuál es la diferencia fundamental entre OSGi y Java EE?", Entonces sería más útil y menos "basado en la opinión" –

+0

En este punto uno puede decir ... OSGi es principalmente un contenedor que lo hace lo que CDI intenta resolver (inyección y resolución de dependencia) pero * no * normalmente * evita que se ejecute cuando hay errores. Proporciona una interfaz [generalmente a través de la línea de comando] que permitiría correcciones en el tiempo de ejecución. Java EE requeriría una implementación para resolver los problemas. Java EE es una pila de aplicaciones, aunque proporciona servicios de contenedor, solo está dentro del alcance de la aplicación (aunque puede recibir inyecciones de un servidor) Tenga en cuenta que los servidores Java EE grandes ahora están basados ​​en OSGi. –

Respuesta

21

Un paquete OSGi es más un "módulo de software" que un archivo "jar", "war" u "ear". Los paquetes OSGi raramente proporcionan beneficios si agrupan una aplicación completa; sin embargo, son muy beneficiosos para la automatización y el manejo correcto de conectar muchas bibliotecas.

Así que considere el problema que OSGi intentó resolver, y comprenderá mejor dónde encaja. Es el equivalente de Java del patrón de "herencia de diamantes" de C++. Incluye dos bibliotecas, cada una de las cuales necesita una biblioteca de registro común, pero en este caso no se debe a la herencia múltiple, sino a múltiples instrucciones de inclusión.

Si las dos bibliotecas funcionan con la misma versión de la biblioteca de registro común, tiene suerte. Si no es así, para que cada biblioteca funcione correctamente de forma independiente, debe cargar dos copias de la misma biblioteca, cada una de las cuales probablemente use los mismos espacios de nombre (y, a menudo, los mismos nombres de clase).

OSGi es un medio de agrupamiento que permite que se carguen dos versiones de la misma biblioteca que usan los mismos espacios de nombre, los mismos nombres de clase, pero se crearon en momentos diferentes. También conecta la versión "correcta" al paquete OSGi "correcto", evitando que un paquete use la versión "incorrecta" de la biblioteca "derecha".

Java EE hace mucho, pero esto no es algo a lo que Java EE siquiera se dirige. En el mejor de los casos, el proyecto Jigsaw estaba trabajando en el mismo problema. Donde entra en juego la confusión de Java EE/OSGi es que la mayoría de los primeros en adoptar OSGi bundling eran aquellos que estaban implementando funcionalidades similares a algunas de las bibliotecas que se ofrecen en Java EE. Dicho esto, el marco de conexión de contenedor real (OSGi) no tenía nada que ver con la funcionalidad del paquete (aunque parte del descubrimiento se modificó estructuralmente para cumplir con los requisitos de agrupamiento de OSGi).

+1

¿No podrían los administradores de dependencias transitivos como Maven o Apache Ivy resolver este "infierno JAR" solos? Si mi aplicación depende de 2 bibliotecas L1 y L2, y L1 depende de joda-time-1.1.jar, y L2 depende de joda-time-1.2.jar, Ivy lo resolverá por mí, y siempre que tenga ambas versiones de joda-time en mi classpath en tiempo de ejecución, estoy listo para irme. Todavía no se ve el bosque a través de los árboles aquí ... – IAmYourFaja

+1

Ivy puede descargar los dos archivos jar, pero cuando es el momento de compilar, Java no permite que se definan dos clases diferentes en el mismo cargador de clases con el mismo nombre. Si coloca ambos en la ruta de la clase, la primera que satisfaga el nombre de la clase devolverá la clase, independientemente de si es la versión correcta o incorrecta.Por lo tanto, necesita árboles de carga de clases que dependan específicamente de los "paquetes" que llamen a la clase. Lo que significa que efectivamente necesita una forma de rastrear lo que el paquete necesita, de ahí los archivos de manifiesto y, finalmente, un "marco" alias Jigsaw u OSGi. –

+0

Ok ... así que OSGi básicamente se ocupa de los problemas del espacio de nombres al proporcionar un conjunto de cargadores de clases especializados. Por lo tanto, si tiene la suerte de tener un gráfico de dependencias donde no hay dos bibliotecas que dependan del mismo contenedor (o de las mismas versiones de jarras), entonces no necesita OSGi. Otherise, parece una herramienta bastante esencial. ¿Es esta una buena evaluación? Además, si OSGi solo ahora está aumentando, ¿cómo han existido las aplicaciones Java EE durante tanto tiempo sin abordar este problema? ¡Esto es algo importante! – IAmYourFaja

2

La mayoría de los principales beneficios, al menos los motivos por los que usamos OSGi, se enumeran en http://karaf.apache.org/, notablemente los dos primeros.

Además, la alianza OSGi tiene una larga lista de beneficios: https://www.osgi.org/developer/benefits-of-using-osgi/.

+1

Vale la pena agregar que un paquete OSGi no es una aplicación "completa" sino más bien un subcomponente que puede ser utilizado por cualquier otro paquete, cuya colección compone una aplicación. – Tony

3

Comparar Java EE con OSGi es como comparar manzanas y naranjas con la ventaja adicional de no saber qué es qué.

Java EE focus se basa en aplicaciones comerciales escalables de varios niveles en entornos heterogéneos e integración de sistemas de información para toda la empresa.

OSGi comenzó en otra esquina mediante la integración de varias bases de código independientes en una JVM (discúlpeme por ser extremadamente breve).

Por supuesto algunos problemas de (por ejemplo, implementación en caliente) son comunes a ambos entornos, pero en mayor o menor grado.

Por supuesto, puede actualizar, degradar y cruzar ambos y se encontrarán en algún lugar en el medio.

Así que la pregunta no debería ser "¿Qué beneficio tiene A sobre B?" Sino algo así como "¿En qué campo A tiene claras ventajas sobre B y viceversa?" Permítanme reformular eso: "¿Cuándo necesito un martillo y cuándo necesito una sierra?"

+8

Si esa es la pregunta, ¿cuál es tu respuesta? ;) –

0

Lo siento, pero TODAS las respuestas aquí son completamente irrisorias. ¿Problemas de versión de dependencia resueltos con OSGi? Pooooohlease ... ¿Has oído hablar de las políticas de cargador de clases en los servidores de aplicaciones?

OSGi parece una idea para seguir vendiendo libros nuevos y capacitación, mientras que las necesidades funcionales han estado cubiertas durante eones por el empaque de JAR/EAR & despliegue en JEE. Aquellos que lo compran simplemente nunca llegaron a entender cómo están siendo manipulados. También hay una cuestión de tendencias y moda. Es decir. consideraciones no de ingeniería que son una vergüenza para esta industria.

Reinventar la rueda es rentable porque hay toneladas de tontos por ahí. Desafortunadamente, hay toneladas de simplones de tipo gerencial que quieren estar al "borde de la tecnología" que gustosamente financiarán los cursos de sus empleados, absorberán la curva de aprendizaje y luego pagarán por su nariz en "reingeniería" de las cosas eso no tenía nada de malo con ellos para empezar.

No se trata de "usar un destornillador de martillo". Es más una cuestión de "hola jefe, hay algo nuevo llamado HEMMAR, ¡y es genial!". "¿No es un HAMMER?", "No, no, es mejor, es un HEMMAR, es para clavar clavos en tableros, revolucionará el mundo".

+0

Aunque está fuera de tema (funcionalmente) esta es la mejor y más correcta respuesta aquí, la diferencia es que * pague * por un "contenedor" de jee o descargue e instale uno para "gratis" en su organización y aprenda a usarlo correctamente. – sloven

+0

Las aplicaciones empresariales por naturaleza evolucionan. No produce aplicaciones empresariales el día 1. Las políticas de carga de JEE son una verdadera pesadilla para gestionar cuando tiene 1000 módulos y todos tienen que trabajar juntos. El módulo JEE solo puede ser un EJB, MDB. RAR o WEB ¿qué tal un solo JAR? ¿Qué tal el tiempo de inactividad si desea actualizar incluso un solo módulo ... Sin cambios de fase! ¡Así que Pooooohlease JEE no está muy cerca de lo que OSGi está resolviendo! – SJunejo

Cuestiones relacionadas