WAR Dateien in Tomcat 7 entpacken - unpackWARs

Bereits in Vorgängerversionen ist Tomcat standardmäßig so konfiguriert, dass WAR Dateien beim Deployment entpackt werden.

Das ermöglicht unter anderem, statische Inhalte (CSS, JS, Bilder, …) über einen anderen Webserver bereit zu stellen.

Allerdings kann es unter gewissen Umständen passieren, dass nach dem Update auf Tomcat 7 Applikationen verpackt bleiben – obwohl unpackWARs oder unpackWAR gesetzt ist.

Wann bleibt unpackWARs in Tomcat 7 effektlos?

Ein Vergleich der Tomcat-Dokumentationen zu unpackWAR im Context Container-Abschnitt ‘Standard Implementation’ zeigt warum:

Wichtiger Unterschied: “Note that WAR files located outside of a Host’s appBase are never unpacked.”

Hat man also beispielsweise in der context.xml (oder ROOT.xml) einen Pfad außerhalb des laut server.xml definierten Hosts angegeben, so ist unpackWARs effektlos.

Beispiel

Inhalt von /usr/local/apache-tomcat-7.0/conf/Catalina/localhost/ROOT.xml

<Context docBase="/home/someuser/some-grails-app.war" path="" reloadable="true"/>

Lösung: Symlink zur Applikation in webapps Verzeichnis

Damit WAR’s wieder entpackt werden, kann man entweder die appBase in der Host-Definition anpassen oder man entfernt die ROOT.xml und setzt stattdessen einen entsprechenden Symlink:

# Verschieben der original ROOT-Applikation:
mv /usr/local/apache-tomcat-7.0/webapps/ROOT /usr/local/apache-tomcat-7.0/webapps/ROOT_orig
# Verlinken der Grails-Beispielapplikation als ROOT.war:
ln -s /home/someuser/some-grails-app.war /usr/local/apache-tomcat-7.0/webapps/ROOT.war

Der hier gesetzte Link sorgt dafür, dass die Grails Applikation mit dem Namen “some-grails-app” als ROOT-Anwendung entpackt und gestartet wird.

1 Kommentar

  1. Maxim sagt:

    Vielen Dank für diesen Post. Bin mit meiner Webapplikation genau in das gleiche Problem gelaufen. Die Lösung mit dem Symlink klappt wunderbar.