Pregunta

Estamos usando un archivo WAR en Tomcat 5.5 y funciona bien si WEB-INF \ classes contiene archivos .classes, pero si nos movemos el archivo .jar que contiene ese .classes en WEB-INF \ lib, que reciben una excepción en tiempo de ejecución se queja de que java.lang.NoSuchMethodError, pero archivo de clase existente en el archivo .jar contiene la clase y método tiene salidas!

Cualquier ayuda en esto sería apreciada.

¿Fue útil?

Solución

Esto podría ser causado debido a un conflicto de clases. Asegúrese de que no hay una versión más antigua de la clase en algún lugar (carpeta compartida de Tomcat, WEB-INF / classes, WEB-INF / lib). Si este es el caso, que prácticamente no se puede saber qué clase de Tomcat se carga. Si se escoge uno sin el método, se producirá la excepción que está experimentando.

Otros consejos

Desde que está recibiendo un NoSuchMethodError, y no un ClassNotFoundError, significa que usted tiene una versión antigua de la clase en algún lugar (fuera del archivo jar). Es necesario encontrar y retirarla.

Esta es la clase closin defently eche un vistazo aquí http: //tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html#Class%20Loader%20Definitions

como se puede ver que hay una mayor prioridad para las clases bajo WEB-INF / classes comparan WEB-INF / lib. Tiene las dos clases con el mismo nombre (y el paquete). Cuando uno de ellos se encuentra en las clases de carpeta que tiene mayor prioridad. cuando ambos están en la carpeta lib entonces el segundo llegar primero (frascos tienen una prioridad basada en su orden alfa BETICAL)

Esto puede explicar su situación.

Espero que ayuda  - Yonatan

Desde la perspectiva de una aplicación web, la clase o el recurso de carga se ve en los siguientes repositorios, en este orden:

clases de archivos de inicio de la JVM
clases de cargador de clases del sistema (descrito anteriormente)
/ WEB-INF / classes de su aplicación web
/WEB-INF/lib/*.jar de su aplicación web
clases de cargador de clases común (descrito anteriormente)

Las ubicaciones buscadas por "cargador de clases común" se definen por la propiedad common.loader en CATALINA_BASE $ / conf / catalina.properties. Aquí es donde permitimos / definimos ubicación de recurso compartido;
shared.loader = $ {} catalina.base / shared / clases, $ {} catalina.base / shared / lib / *. jar

Y el orden anterior da una visión más clara de que el problema que enfrenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top