¿Cómo actualizo una aplicación web Tomcat sin reiniciar todo el servicio?


93

Soy nuevo en Tomcat. Tenemos una máquina de desarrollo con aproximadamente 5 aplicaciones en ejecución. Aunque es un desarrollador, nuestros clientes lo utilizan bastante durante las pruebas.

Entonces, digamos que necesitamos hacer un pequeño cambio en un archivo de clase. En este momento, tenemos que cerrar Tomcat (que afecta a las otras cuatro aplicaciones), eliminar el WARarchivo (y el directorio de la aplicación web), WARvolver a implementar el nuevo archivo y reiniciar Tomcat.

Por supuesto, esto molesta a algunas personas porque destruye todas las sesiones registradas para todas las aplicaciones.

¿Hay una mejor manera de hacer esto? Quiero decir, ¿hay alguna manera de recargar solo la CLASE que cambió en lugar de todo en la máquina de desarrollo?

Gracias.


¿Cambiar la administración de su sesión a algo que persista en el archivo? Lo siento, no pude resistir :)
Rogerdpack

1
@rogerdpack He aprendido mucho sobre Tomcat desde que hice esta pregunta hace más de seis años. Pero gracias de todos modos.
cbmeeks

Con respecto al intercambio en caliente solo de clases, consulte stackoverflow.com/questions/32459047/…
rogerdpack

Respuestas:


59

¿Ha intentado utilizar la aplicación Tomcat's Manager ? Le permite anular la implementación / implementación de archivos de guerra sin apagar Tomcat.

Si no desea utilizar la aplicación Manager, también puede eliminar el archivo war del directorio webapps, Tomcat anulará la implementación de la aplicación después de un corto período de tiempo. A continuación, puede volver a copiar un archivo war en el directorio y Tomcat lo implementará.

Si está ejecutando Tomcat en Windows, es posible que deba configurar su contexto para no bloquear varios archivos.

Si no puede tener ningún tiempo de inactividad, es posible que desee ver las implementaciones paralelas de Tomcat 7. Puede implementar varias versiones de una aplicación web con la misma ruta de contexto al mismo tiempo. Las reglas que se utilizan para hacer coincidir las solicitudes con una versión de contexto son las siguientes:

  • Si no hay información de sesión presente en la solicitud, use la última versión.
  • Si la información de la sesión está presente en la solicitud, verifique el administrador de sesiones de cada versión para una sesión que coincida y si encuentra una, use esa versión.
  • Si la información de la sesión está presente en la solicitud pero no se puede encontrar una sesión coincidente, use la última versión.

Esa también es una buena sugerencia. Nunca oí hablar de la aplicación de administrador hasta hoy. Sí, usamos Windows. Una preocupación que tengo al eliminar el archivo WAR y esperar es que nuestros clientes esperan "pequeñas correcciones" con frecuencia. ¿Funcionarían esas sugerencias para ese escenario?
cbmeeks

1
@cbmeeks: depende de la frecuencia con la que se produzcan estas pequeñas correcciones y de cuánto tiempo antes de que alguien se dé cuenta. En cualquier caso, habrá una pequeña cantidad de tiempo en que la aplicación no estará disponible. Depende de su hardware / aplicación la duración de ese tiempo. Pero se mide en segundos, yo diría que normalmente de 5 a 10 en nuestras aplicaciones. Pero su kilometraje puede variar :)
Steve K

1
Guau. He aprendido mucho desde que hice esta pregunta. Sí, ahora implementamos aplicaciones de Tomcat sin tener que derribar Tomcat por completo. Una cosa que hice fue asegurarme de que todos los registros (aplicación y Tomcat) no registran registros DENTRO de la carpeta de aplicaciones web / aplicaciones. O bien, configurar Tomcat para que no se bloquee también funciona. Así que colocamos el registro en un lugar central fuera de la carpeta de Tomcat. Funciona como un sueño. Pero tu respuesta fue la más útil. ¡Gracias!
cbmeeks

5
Cuando vuelva a implementar sin reiniciar, tendrá que tener cuidado con las pérdidas de memoria; muy a menudo, los cargadores de clases perderán referencias y debe reiniciar todo el proceso de Tomcat para liberar memoria de la versión anterior de la aplicación. LiveRebel (mencionado en otra respuesta) puede automatizar todo eso por usted.
Neeme Praks

3
No es necesario eliminar la guerra para volver a desplegar. Simplemente copie la vieja guerra y espere unos segundos.
peceps

30

Hay varias formas sencillas.

  1. Simplemente toque web.xml de cualquier aplicación web.

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

También puede actualizar un archivo jar en particular en WEB-INF / lib y luego tocar web.xml, en lugar de crear el archivo war completo y volver a implementarlo.

  1. Elimine el directorio webapps / YOUR_WEB_APP, Tomcat comenzará a implementar war en 5 segundos (asumiendo que su archivo war todavía existe en la carpeta webapps).

  2. Generalmente, la sobrescritura del archivo war con la nueva versión se vuelve a implementar automáticamente por Tomcat. De lo contrario, puede tocar web.xml como se explicó anteriormente.

  3. Copie un "directorio" ya explotado a su carpeta de aplicaciones web


1
Es útil saber que el método 'touch' no recarga clases. IOW, no purga ni recarga la jerarquía del cargador de clases para la aplicación web
Rondo

2
Al ver por qué esto funciona, se puede leer $CATALINA_BASE/conf/context.xml. WEB-INF / web.xml se vigila para detectar cambios. Otros recursos se pueden enumerar fácilmente allí según sea necesario.
Kevin

21

En el directorio conf de apache tomcat puede encontrar el archivo context.xml. En esa etiqueta de edición como < Context reloadable = "true" >. esto debería resolver el problema y no es necesario reiniciar el servidor


En su lugar, prefiere la aplicación de administrador. Esta es una operación costosa para el ariete.
Clasificador
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.