Comment mettre à jour une application Web Tomcat sans redémarrer l'ensemble du service?

93

Je suis nouveau Tomcat. Nous avons une machine de développement avec environ 5 applications en cours d'exécution. Même s'il s'agit de développement, il est largement utilisé par nos clients pendant les tests.

Alors disons que nous devons faire un petit changement sur un fichier de classe. Pour le moment, nous devons arrêter Tomcat (affectant les quatre autres applications), supprimer le WARfichier (et le répertoire de l'application Web), redéployer le nouveau WARfichier et redémarrer Tomcat.

Bien sûr, cela dérange quelques personnes car cela détruit toutes les sessions connectées pour toutes les applications.

Y a-t-il une meilleure manière de faire cela? Je veux dire, y a-t-il un moyen de ne recharger que la classe qui a changé au lieu de tout sur la machine de développement?

Merci.

cbmeeks
la source
Changer votre gestion de session en quelque chose qui persiste dans le fichier? Désolé n'a pas pu résister :)
rogerdpack
1
@rogerdpack J'ai beaucoup appris sur Tomcat depuis que j'ai posé cette question il y a plus de six ans. Mais merci quand même.
cbmeeks
En ce qui concerne le remplacement à chaud des classes uniquement, voir stackoverflow.com/questions/32459047/…
rogerdpack

Réponses:

59

Avez-vous essayé d'utiliser l'application Tomcat's Manager ? Il vous permet d'annuler le déploiement / déployer des fichiers de guerre sans arrêter Tomcat.

Si vous ne souhaitez pas utiliser l'application Manager, vous pouvez également supprimer le fichier war du répertoire webapps, Tomcat annulera le déploiement de l'application après une courte période. Vous pouvez ensuite recopier un fichier war dans le répertoire et Tomcat déploiera le fichier war.

Si vous exécutez Tomcat sous Windows, vous devrez peut-être configurer votre contexte pour ne pas verrouiller divers fichiers.

Si vous ne pouvez absolument pas avoir de temps d'arrêt, vous pouvez consulter les déploiements parallèles de Tomcat 7. Vous pouvez déployer plusieurs versions d'une application Web avec le même chemin de contexte en même temps. Les règles utilisées pour faire correspondre les demandes à une version de contexte sont les suivantes:

  • Si aucune information de session n'est présente dans la demande, utilisez la dernière version.
  • Si des informations de session sont présentes dans la demande, vérifiez le gestionnaire de session de chaque version pour une session correspondante et si une est trouvée, utilisez cette version.
  • Si des informations de session sont présentes dans la demande mais qu'aucune session correspondante n'est trouvée, utilisez la dernière version.
Steve K
la source
C'est aussi une bonne suggestion. Je n'ai jamais entendu parler de l'application manager jusqu'à aujourd'hui. Oui, nous utilisons Windows. Une préoccupation que j'ai avec la suppression du fichier WAR et l'attente est que nos clients attendent fréquemment de «petites corrections». Ces suggestions fonctionneraient-elles pour ce scénario?
cbmeeks
1
@cbmeeks - Cela dépend de la fréquence à laquelle ces petites corrections se produisent et du délai avant que quelqu'un ne le remarque. Dans les deux cas, l'application ne sera pas disponible pendant une courte période. La durée de ce délai dépend de votre matériel / application. Mais c'est mesuré en secondes, je dirais généralement 5-10 sur nos applications. Mais votre kilométrage peut varier :)
Steve K
1
Sensationnel. J'ai tellement appris depuis que j'ai posé cette question. Oui, nous déployons maintenant des applications Tomcat sans arrêter complètement Tomcat. Une chose que j'ai faite a été de m'assurer que tous les journaux (app et Tomcat) n'enregistrent pas les journaux DANS le dossier webapps / application. Ou, la configuration de Tomcat pour ne pas se verrouiller fonctionne également. Nous mettons donc la journalisation dans un endroit central en dehors du dossier de Tomcat. Fonctionne comme un rêve. Mais votre réponse a été la plus utile. Merci!
cbmeeks
5
Lors du redéploiement sans redémarrage, vous devrez faire attention aux fuites de mémoire - très souvent, les chargeurs de classe fuiront des références et vous devrez redémarrer l'ensemble du processus Tomcat afin de libérer de la mémoire de l'ancienne version de l'application. LiveRebel (mentionné dans une autre réponse) peut automatiser tout cela pour vous.
Neeme Praks
3
Vous n'avez pas besoin de supprimer la guerre pour le redéployer. Copiez simplement l'ancienne guerre et attendez quelques secondes.
peceps
30

Il existe plusieurs moyens simples.

  1. Touchez simplement web.xml de n'importe quelle application Web.

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

Vous pouvez également mettre à jour un fichier jar particulier dans WEB-INF / lib, puis toucher web.xml, plutôt que de créer un fichier war entier et de le déployer à nouveau.

  1. Supprimez le répertoire webapps / YOUR_WEB_APP, Tomcat commencera à déployer war dans les 5 secondes (en supposant que votre fichier war existe toujours dans le dossier webapps).

  2. En général, l'écrasement du fichier war avec une nouvelle version est redéployé automatiquement par tomcat. Sinon, vous pouvez toucher web.xml comme expliqué ci-dessus.

  3. Copiez un «répertoire» déjà éclaté dans votre dossier Webapps

Chirag Katudia
la source
1
Utile pour savoir que la méthode 'touch' ne recharge pas les classes. IOW, il ne purge pas et ne recharge pas la hiérarchie du chargeur de classe pour la webapp
Rondo
2
Voir pourquoi cela fonctionne peut être lu $CATALINA_BASE/conf/context.xml. Le WEB-INF / web.xml est surveillé pour les changements. D'autres ressources peuvent facilement y être répertoriées selon les besoins.
Kevin
21

Dans le répertoire conf d'apache tomcat, vous pouvez trouver le fichier context.xml. Dans cette balise d'édition comme < Context reloadable = "true" >. cela devrait résoudre le problème et vous n'avez pas besoin de redémarrer le serveur

skal
la source
Préférez plutôt l'application du gestionnaire. C'est une opération coûteuse pour le bélier.
Trieur