Wie aktualisiere ich eine Tomcat-Webanwendung, ohne den gesamten Dienst neu zu starten?

93

Ich bin neu in Tomcat. Wir haben eine Entwicklungsmaschine mit ungefähr 5 Apps. Obwohl es ein Entwickler ist, wird es von unseren Kunden beim Testen ziemlich häufig verwendet.

Nehmen wir also an, wir müssen eine kleine Änderung an einer Klassendatei vornehmen. Im Moment müssen wir Tomcat herunterfahren (was sich auf die anderen vier Apps auswirkt), die WARDatei (und das Web-App-Verzeichnis) löschen , die neue WARDatei erneut bereitstellen und neu starten Tomcat.

Dies stört natürlich einige Leute, da alle angemeldeten Sitzungen für alle Apps zerstört werden.

Gibt es einen besseren Weg, dies zu tun? Ich meine, gibt es eine Möglichkeit, nur die KLASSE neu zu laden, die sich geändert hat, anstatt alles auf dem Entwicklungscomputer?

Vielen Dank.

cbmeeks
quelle
Ändern Sie Ihre Sitzungsverwaltung in eine Datei, die weiterhin gespeichert werden kann? Sorry konnte nicht widerstehen :)
Rogerdpack
1
@rogerdpack Ich habe viel über Tomcat gelernt, seit ich diese Frage vor über sechs Jahren gestellt habe. Danke trotzdem.
cbmeeks
Informationen zum
rogerdpack

Antworten:

59

Haben Sie versucht, die Manager-Anwendung von Tomcat zu verwenden ? Sie können damit die Bereitstellung von Kriegsdateien aufheben / bereitstellen, ohne Tomcat herunterfahren zu müssen.

Wenn Sie die Manager-Anwendung nicht verwenden möchten, können Sie die War-Datei auch aus dem Webanwendungsverzeichnis löschen. Tomcat stellt die Anwendung nach kurzer Zeit wieder bereit. Sie können dann eine Kriegsdatei zurück in das Verzeichnis kopieren, und Tomcat stellt die Kriegsdatei bereit.

Wenn Sie Tomcat unter Windows ausführen, müssen Sie möglicherweise Ihren Kontext so konfigurieren , dass verschiedene Dateien nicht gesperrt werden.

Wenn Sie absolut keine Ausfallzeiten haben können, sollten Sie sich die parallelen Bereitstellungen von Tomcat 7 ansehen. Sie können mehrere Versionen einer Webanwendung mit demselben Kontextpfad gleichzeitig bereitstellen. Die Regeln zum Abgleichen von Anforderungen mit einer Kontextversion lauten wie folgt:

  • Wenn die Anforderung keine Sitzungsinformationen enthält, verwenden Sie die neueste Version.
  • Wenn in der Anforderung Sitzungsinformationen vorhanden sind, überprüfen Sie den Sitzungsmanager jeder Version auf eine übereinstimmende Sitzung. Wenn eine gefunden wird, verwenden Sie diese Version.
  • Wenn Sitzungsinformationen in der Anforderung vorhanden sind, aber keine passende Sitzung gefunden werden kann, verwenden Sie die neueste Version.
Steve K.
quelle
Das ist auch ein guter Vorschlag. Ich habe bis heute noch nie von der Manager-App gehört. Ja, wir verwenden Windows. Ein Problem beim Löschen der WAR-Datei und beim Warten ist, dass unsere Kunden häufig "kleine Korrekturen" erwarten. Würden diese Vorschläge für dieses Szenario funktionieren?
cbmeeks
1
@cbmeeks - Es hängt davon ab, wie oft diese kleinen Korrekturen auftreten und wie lange es dauert, bis jemand es bemerkt. In beiden Fällen wird die Anwendung nur eine kurze Zeit nicht verfügbar sein. Es hängt von Ihrer Hardware / Anwendung ab, wie lange diese Zeit dauert. Aber es wird in Sekunden gemessen, ich würde sagen, normalerweise 5-10 auf unseren Anwendungen. Aber Ihr Kilometerstand kann variieren :)
Steve K
1
Beeindruckend. Ich habe so viel gelernt, seit ich diese Frage gestellt habe. Ja, wir stellen jetzt Tomcat-Apps bereit, ohne Tomcat vollständig herunterzufahren. Eine Sache, die ich getan habe, war sicherzustellen, dass alle Protokollierungen (App und Tomcat) keine Protokolle im Ordner webapps / application aufzeichnen. Oder es funktioniert auch, Tomcat so zu konfigurieren, dass es nicht sperrt. Deshalb haben wir die Protokollierung an einem zentralen Ort außerhalb von Tomcats Ordner abgelegt. Funktioniert wie ein Traum. Aber Ihre Antwort war am hilfreichsten. Vielen Dank!
cbmeeks
5
Bei einer erneuten Bereitstellung ohne Neustart müssen Sie mit Speicherverlusten vorsichtig sein. Sehr oft verlieren die Klassenladeprogramme Referenzen und Sie müssen den gesamten Tomcat-Prozess neu starten, um Speicher aus der alten Version der Anwendung freizugeben. LiveRebel (in einer anderen Antwort erwähnt) kann all das für Sie automatisieren.
Neeme Praks
3
Sie müssen den Krieg nicht löschen, um ihn erneut bereitzustellen. Kopieren Sie einfach den alten Krieg und warten Sie einige Sekunden.
Peceps
30

Es gibt mehrere einfache Möglichkeiten.

  1. Berühren Sie einfach web.xml einer beliebigen Webanwendung.

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

Sie können auch eine bestimmte JAR-Datei in WEB-INF / lib aktualisieren und dann web.xml berühren, anstatt die gesamte War-Datei zu erstellen und erneut bereitzustellen.

  1. Löschen Sie das Verzeichnis webapps / YOUR_WEB_APP. Tomcat beginnt innerhalb von 5 Sekunden mit der Bereitstellung von war (vorausgesetzt, Ihre war-Datei befindet sich noch im Ordner webapps).

  2. Im Allgemeinen wird das Überschreiben von War-Dateien mit einer neuen Version von Tomcat automatisch neu bereitgestellt. Wenn nicht, können Sie web.xml wie oben erläutert berühren.

  3. Kopieren Sie über ein bereits explodiertes "Verzeichnis" in Ihren Webapps-Ordner

Chirag Katudia
quelle
1
Nützlich zu wissen, dass die 'touch'-Methode keine Klassen neu lädt. IOW, es löscht und lädt nicht die Classloader-Hierarchie für die Webanwendung
Rondo
2
Zu sehen, warum dies funktioniert, kann eingelesen werden $CATALINA_BASE/conf/context.xml. Die WEB-INF / web.xml wird auf Änderungen überwacht. Andere Ressourcen können dort bei Bedarf einfach aufgelistet werden.
Kevin
21

Im conf-Verzeichnis von apache tomcat finden Sie die Datei context.xml. In diesem Bearbeitungs-Tag als < Context reloadable = "true" >. Dies sollte das Problem lösen und Sie müssen den Server nicht neu starten

skal
quelle
Bevorzugen Sie stattdessen die Manager-Anwendung. Dies ist eine teure Operation für den Stößel.
Sortierer