Páginas

viernes, 28 de octubre de 2011

Conflicto Hibernate y Jersey

Ultimamente he tenido que añadir la librería Jersey a un proyecto que se encuentra desarrollado con Struts e Hibernate. Para aquellos que no conozcan esta librería, decir que es una implementación de JAXB-WS que nos permite crear, de forma rápida y sencilla, Servicios WEB REST.

Una vez integrado jersey en el proyecto, cuando realicé mi primera petición al servicio, el cual me devolvía una entidad que se encontraba persistida en la base de datos, me elevó la siguiente excepción:

               java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

¿Qué está pasando?
Se debe a un conflicto con la librería "asm". Hibernate, hace uso de la librería "cglib", que esta, a su vez hace uso de la librería "asm-1.5.3". Por otro lado, Jersey usa la librería "asm-3.5.1"

                                                    ¡¡¡¡CONFLICTO!!!

Si eliminamos la librería cglib, Jersey funcionará correctamente pero Hibernate NO. Y si eliminamos la librería asm, Hibernate funcionará correctamente pero Jersey NO.

SOLUCIÓN:
Para resolver este conflicto, debemos hacer uso de la librería "cglib-nodep.jar". Esta librería es una implementación de cglib, que incluye las clases de ASM demandadas por esta. Con lo cual, lo que tenemos que hacer, es reemplazar en nuestro proyecto la librería cglib por cglib-nodep y problema resuelto.

Exception "class file has wrong version 50.0, should be 49.0"

DESCRIPCIÓN DEL PROBLEMA

Cuando usamos el servidor Tomcat en Windows, podemos iniciarlo de dos formas:

  • Usando el fichero "Catalina.bat", desde la consola.
  • Haciendo uso del servicio de windows, el cual utiliza la dll "jvm.dll"
Si usamos el arranque del tomcat en su versión 5, configurado con la máquina virtual 1.6 (sea la jdk o la jre) haciendo uso del servicio de windows, por defecto cuando busque alguna librería lo hará en el servidor de aplicaciones y no en la máquina virtual.

Cuando se haga uso de servicios web como axis, nos podemos encontrar con un conflicto con la librería tools.jar obteniendo una traza de error similar a:

class file has wrong version 50.0, should be 49.0 (50 se refiere a java1.6 y 49 a Java 1.5)

Se habrían de realizar las siguientes comprobaciones:
  1. Asegurarnos que se esta empleando la máquina virtual 1.6 para arrancar el tomcat, revisando la variable JAVA_HOME, etc..
  2. Puede suceder que la única máquina virtual que tengamos instalada en la máquina sea la 1.6, entonces ¿de donde viene el error?.

En el segundo caso el error proviene de la librería tools.jar (que dentro del Tomcat 5 puede ser antigua). 

SOLUCIÓN:

Copia el fichero tools.jar que de se encuentra dentro del directorio de la jdk o la jre al common/lib del tomcat y listo!!! solucionado el problema!!