2011-08-30 10 views
5

Me enfrenta el siguiente problema: Tengo un módulo en mi aplicación web que necesita jaxb 1.x y el otro módulo necesita jaxb 2.x. El primer módulo no funciona con la nueva versión de jaxb, y al revés. ¿Cómo puedo usar estos dos frascos en un proyecto? Gracias.java: use dos versiones de la misma lib en una sola aplicación web

+1

Puede describir lo que entendemos por 'módulo en mi aplicación web'. Por ejemplo, ¿son módulos ejb separados o son solo capas separadas que comparten el mismo classpath? Además, ¿puede enumerar qué son las bibliotecas que tienen la dependencia de las jarras JAXB? –

+0

Puede pensar en el módulo como de una lib (es más complicado, pero al final tengo archivos jar que están vinculados a mi aplicación web vía classpath). El primero es docx4j.jar y el segundo es un ayudante externo para trabajar con WebService. No puedo cambiar ni third third helper ni docx4j.jar – Nick

Respuesta

2

Tienes un problema grave. En términos generales, en un entorno Java normal es imposible resolver este problema. Debe forzar la modularización en su proyecto mediante el uso de OSGI. Punto de inicio: http://www.osgi.org/About/HowOSGi

5

Para una aplicación normal, generalmente versiones muy diferentes usan nombres de paquetes diferentes. Si este es el caso, puede usarlos a la vez sin problemas. Sin embargo, si son iguales, puede usar jarjar para cambiar el nombre del paquete.

Sin embargo, como utiliza un contenedor web, cada aplicación debe usar la versión que implementa y no la otra. es decir, el contenedor web lo resuelve para usted.

OSGi es otro contenedor que gestiona las versiones mucho más explícita y le dará más control sobre estos temas (sin embargo, creo que lo necesite sólo para esto)

+0

Sí, puedo cambiar el nombre del paquete para un jar de jaxb 2.1, pero no quiero hacerlo. Es porque la solución es una 'suciedad'. OSGi sí, pero solo si no hay otra solución ... hm .... el cambio de nombre parece cada vez más adecuado) – Nick

+0

Es a lo que se agregó la funcionalidad de cambio de nombre. He visto un único contenedor con cuatro versiones diferentes de Xerces que puede seleccionar en tiempo de ejecución. :-P –

1

Como dijo Shaman es imposible de resolver este problema.

Veamos: el contenedor de servlets JRE tiene solo un cargador de clases, y este cargador de clases puede cargar y usar una clase de jaxb u otra, pero no ambas que le darán una excepción de clase desconocida o algo similar.

No puede resolver esto directamente: puede obtener el código (es de código abierto) y cambiar el paquete de uno a otro nombre para que el cargador de clases pueda usar ambos. No te recomiendo esta solución, es una mala.

Mejor es que migre el código para utilizar la API más moderna (jaxb 2)

+0

No se puede hacer eso. Porque no tienes todas las fuentes. ¿Hay alguna manera de cargar nuevas clases por mi cuenta? Por ejemplo, pongo toda la lógica y las dependencias en un solo jar y cargo su clase principal. Entonces lo llamo métodos de negocios. ¿Qué será si hago eso? – Nick

Cuestiones relacionadas