Conflicto de librerías JBoss Application Server 6

Recientemente tengo unos proyectos montados sobre este famoso servidor, sin embargo me ha dado unos cuantos problemas por la gestión de las librerias.

Por ejemplo:

  1. Tienes una aplicación web y dentro de tu empaquedato war tienes la libreria mail-1.4.3.jar.
  2. El servidor JBoss por defecto y como todos los otros servidores, tiene cargadas librerias que comparte con las aplicaciones web viven dentro del servidor, supongamos que nuestro JBosss tiene la mail-1.4.0.jar, la pregunta aquí es ¿cual es la que va tomar tu aplicación una vez que haces el deploy?.

¿Ves el problema? lo que va a pasar es que al hacer el deploy lanzará cualquiera de las siguietes Exceptions:

¿Y por que?, porque no sabe que libreria debe utilizar o utiliza clases de una u otra o combinadas y eso provoca problemas de compatibilidad.

Y precisamente la librería del mail es algo especial porque solo debe haber una sola en el classpath del server, y NO puedes tener la librería dos veces aunque sea de la misma versión.

¿Y como le digo cual debe tomar?, cada servidor tiene un mecanismo especial o hay otros que ni lo necesitan pero con JBoss tu puedes indicarle que librerías debe tomar ya sea del war o de las que comparte el servidor.

Sin embargo mi consejo es: crea tu apliación con todas las librerias que necesitas e ignoras las compartidas por el servidor, así evitas errores de conflictos y dependencias.

Esto lo puedes hacer muy fácil, unicamente debes crear dos archivos dentro de la carpeta WEB-INF de tu proyecto:

jboss-classloading.xml, con el siguiente contenido:

<?xml version=”1.0″ encoding=”UTF-8″?>
<classloading xmlns=”urn:jboss:classloading:1.0″
parent-first=”false”
domain=”AppBuild”
top-level-classloader=”true”
export-all=”NON_EMPTY”
import-all=”false”>
</classloading>

jboss-web.xml, con el siguiente contenido:

<?xml version=”1.0″ encoding=”UTF-8″?>
<jboss-web>
<context-root>/MyWebApp</context-root>
<class-loading java2ClassLoadingCompliance=”false”>
<loader-repository>com.myapp:loader=AppBuild
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</class-loading>
</jboss-web>

Las líneas marcadas en negrita son las importantes. Con esto tu aplicación va a tomar las librerias de tu war, no sera dependiente del servidor  por lo que puedes llevarlo fácilmente a otro y sobre todo te evitas los problemas y conflictos de versiones y clases😀.

Saludos!

Referncias

2 comentarios en “Conflicto de librerías JBoss Application Server 6

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s