Despliegue de un WAR basado en Spring con sus dependencias JAR externalizadas

Tengo una aplicación Spring que tiene muchas dependencias (18 megabytes de archivos JAR ...). Ahora, cuando estoy probando en el servidor remoto Tomcat 6.0, me gustaría no tener que cargar esos 19 megabytes de dependencias, y solo sube las clases. Bastante simple, ¿verdad?

No puedo hacer que la maldita cosa funcione.

Estoy usando Eclipse 3.4, y si en Java Build Path-> Order and Export elimino la exportación de todas las dependencias, obtengo una pequeña y agradable WAR.

Entonces, esto es lo que probé:

Subí todas las librerías al servidor y las pegué en común / lib en Tomcat. El directorio no existía, así que lo creé y modifiqué catalina.properties:

shared.loader=${catalina.home}/common/lib/*.jar

He probado un montón de otras configuraciones, pero ninguna funcionó. Reinicie el servidor, la guerra desplegada no puede comenzar. Específicamente:

SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderList$java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener       at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1

Está muriendo tratando de cargar el oyente Log4J, que no puede encontrar en su classpath. La biblioteca de primavera en la que está el oyente está en común / lib.

Además, cuando despliegue la guerra completa de 18 megabytes, funciona bien. Todo se inicia y comienza la aplicación. Por supuesto, funciona bien localmente también.

Ah, y he reemplazado los JAR de registro codificados por los de la carpeta de extras para permitir que Log4j funcione.

¿Alguna ayuda aquí? No tengo idea de por qué esto no está funcionando.

Respuesta 1

"Tengo una aplicación Spring que tiene muchas dependencias (18 megabytes de archivos JAR ...). Ahora, cuando estoy probando en el servidor remoto Tomcat 6.0, me gustaría no tener que cargar esos 19 megabytes de dependencias, y solo sube las clases. Bastante simple, ¿verdad? "

No entiendo esto: 19 MB no es mucho. Sería mucho mejor simplemente empaquetar una WAR y terminar con ella.

Le recomiendo que realice sus pruebas localmente en su propia instancia de Tomcat idéntica, haga que todo funcione y luego implemente WAR en la instancia remota de Tomcat.

ACTUALIZACIÓN: Un problema que tengo al colocar esos JAR en el directorio / lib de Tomcat es que ahora cada aplicación que implemente en esa instancia ve esos JAR: cámbielos por uno, todos se ven afectados. Si coloca los JAR en cada WEB-INF / lib individual, puede modificar cada aplicación sin afectar a otras. El costo es duplicar JAR y espacio en disco, que es barato.

Otro problema si tiene que migrar desde devl-> test-> prod, ahora cada entorno debe tener los JAR idénticos implementados para que su aplicación funcione. Señorita uno y estás roto. Su aplicación depende de tener esas dependencias disponibles. Si no están en el servidor, no tienes suerte. Mantenga el control en sus propias manos y empaquete los archivos JAR en el archivo WAR.

Respuesta: 2

Debe tener cuidado al externalizar las dependencias como esa en un entorno de servidor web. Dependiendo del servidor, puede haber problemas inesperados de carga de clases, incluso cuando parece que se inicia bien.

Estoy de acuerdo con duffymo ... 19 MB no es realmente tan grande ... ¿hay algún razonamiento detrás de querer hacer esto? No lo recomendaría

Respuesta: 3

encuentra la carpeta webapp

cargar los archivos directamente en la carpeta

por ejemplo

/ path-to-tomcat / webapp / myapp /

mantenga la carpeta / path-to-tomcat / webapp / myapp / WEB-INF / lib y cargue los cambios en la carpeta ur / path-to-tomcat / webapp / myapp / classes

luego use Tomcat Manager para reiniciar la aplicación

Respuesta: 4

Respaldo la sugerencia de enviar actualizaciones directamente a $ {CATALINA_HOME} / webapps / <your-app> en el servidor de destino. Los WAR son para despliegue de producción, pero si tiene una conexión lenta y un WAR grande, no es divertido.

Querrás que tu aplicación web se reinicie después de la actualización, por supuesto. Tomcat en modo de desarrollo supervisará algunos archivos en busca de cambios; de forma predeterminada, WEB-INF / web.xml es uno de ellos, así que actualícelo junto con cualquier otra cosa que esté actualizando y debería obtener un reinicio de la aplicación pronto. En caso de apuro, puede usar la aplicación web Manager para activar la aplicación.

Para un mayor control y conveniencia, eventualmente harías bien en usar las tareas ant de Tomcat (que se encuentran cerca de la distribución de Tomcat, ¡no incluidas con ant!) Para reiniciar el servidor y quizás también para implementar tus cambios. Toma un poco de violín, pero vale la pena, ya que querrás volver a usarlo para cada proyecto que realices.

Respuesta: 5
  1. ¿WEB-INF / lib está vacío?
  2. ¿Dónde está log4j.jar?
  3. ¿Dónde está spring.jar?

Esto parece un problema de visibilidad del cargador de clases.

Respuesta: 6

Escucha duffymo y cjstehno.

Agregar frascos a Tomcat's es una receta segura para el desastre.

Mantenga sus frascos en su directorio webapps.

Respuesta: 7

Es extraño que Tomcat no pueda encontrar los archivos jar. De todos modos, coloque todos los frascos en la carpeta común ($ {catalina.home} / lib). (Esto es incluso peor que usar shared.folder, pero debería funcionar para usted).

Por supuesto, como dijeron otros, no debe hacer eso en su sistema de producción. Sin embargo, creo que está bien para un sistema de desarrollo, especialmente si de todos modos necesita hacer pruebas exhaustivas con el sistema de producción.

Otra nota: solo debe hacer esto si tiene el control total del servidor y es el único que instala las aplicaciones.

Respuesta: 8

Estoy usando GridLayout en mi aplicación SWT GUI. Tengo el siguiente GridData definido para cada celda de la cuadrícula. La celda de la cuadrícula en sí es solo una etiqueta. GridData gridData = new GridData (); gridData ....

Sé que se llamará a super cada vez que creamos un objeto de clase hijo. Pero, lo que específicamente quiero saber es que cargará la clase o creará el objeto de esa clase principal. ...

Hemos recibido código Java de un proveedor de software. Contiene muchos bloques try-catch sin nada en la parte catch. Están por todo el lugar. Ejemplo: prueba {spaceBlock ....

Soy un novato en Spring, comencé a desarrollar una aplicación para cargar archivos, utilicé la documentación oficial de Spring pero tengo este error: el procesamiento del controlador falló; La excepción anidada es java.lang ....