Andreas Bruns

Softwareentwicklung für Oldenburg und Bremen

Tomcat-Verzeichnisse der Webapps konfigurieren

Obwohl ich schon seit vielen Jahren beruflich mit dem Tomcat-Server entwickle, hat sich jetzt eine Anforderung ergeben, die ich so zuvor noch nie hatte. Und zwar soll der Tomcat-Server statische Inhalte und Inhalte unterschiedlicher Web-Anwendungen in einer ganz bestimmten Verzeichnisstruktur wiedergeben:

Hauptseite der Anwendung http://domain.de
Unterkategorie ‚Beispiel‘ http://domain.de/example
erstes Beispiel http://domain.de/example/example-1
zweites Beispiel http://domain.de/example/example-2

In anderen Projekten haben wir zumeist unsere entwickelte Webanwendung im webapps-Verzeichnis deployt und jegliche Verzeichnis-Anforderungen mit einem vorgeschalteten Apache-Server erledigt. Diesmal sollte jedoch weitere technische Infrastruktur vermieden werden, sodass kein Apache in Frage kam.

Ich kann mich noch erinnern, dass wir früher bei der Entwicklung mit Eclipse und Tomcat das hervorragende Sysdeo-Tomcat-Plugin genutzt haben – damals steckte Eclipse-WTP noch in den Kinderschuhen. Bei dem Plugin kann der Entwickler angeben, ob die entwickelte Webanwendung über die server.xml oder mit Hilfe einer Context-Datei eingebunden werden soll. Mit diesen Bruchstücken im Kopf findet man dann auch schnell die passende Tomcat-Dokumentation: The Context Container

Das Dokument bietet verschiedene Möglichkeiten, wo die Pfade für die Webanwendungen konfiguriert werden können. Als schnelle Lösung bietet sich erst einmal die conf/server.xml an. Auch wenn davon explizit abgeraten wird, weil Änderungen an der Datei stets ein Neustart des Servers erfordern, kommen wir damit am schnellsten zu unserem Ziel. In meinem Fall einfach folgende Einträge im Abschnitt Host ergänzen und den Server neu starten:

      <Context path="" docBase="/Volumes/System/tomcat-content/root"/>
      <Context path="/example" docBase="/Volumes/System/tomcat-content/example-root"/>
      <Context path="/example/example-1" docBase="/Volumes/System/tomcat-content/example-1"/>
      <Context path="/example/example-2" docBase="/Volumes/System/tomcat-content/example-2"/>

Es ist zu beachten, dass der Root-Path mit einem leeren String „“ angegeben wird und die anderen Pfade mit einem Slash „/“ beginnen müssen. So lassen sich sowohl statische Inhalte als auch Webanwendungen ausliefern. Damit Webanwendungen auch als solche erkannt werden und nicht nur statische Inhalte liefern, muss sich auf oberster Ebene das Verzeichnis WEB-INF mit der obligatorischen web.xml befinden – also beispielsweise: ‚example-2/WEB-INF/web.xml‘

Wenn das funktioniert, sollten wir die Empfehlung der Tomcat-Entwickler beherzigen. Also unsere Einträge aus conf/server.xml wieder entfernen und für jeden Eintrag eine eigene Context-Datei mit dem jeweiligen Context-Eintrag in ‚conf/Catalina/localhost‘ ablegen. Relevant für den Pfad ist dann der Dateiname, sodass das path-Attribut wieder entfernt werden kann. Für die Dateinamen gelten folgende Regeln:

  • Context-Datei (ohne xml-Endung) heißt so wie der Verzeichnispfad:
    example.xml => /example
  • Context-Datei für das Root-Verzeichnis lautet:
    ROOT.xml => /
  • Context-Datei erhalten # bei Verwendung von Subverzeichnissen:
    example#example-1.xml =>/example/example-2

Der Inhalt der Datei example#example-1.xml sieht dann folgendermaßen aus:

<Context docBase="/Volumes/System/tomcat-content/example-1" />

Für die Versuche sollte man übrigens den Tomcat herunterfahren, weil der Server bei aktiviertem Hot-Deployment die Context-Dateien eventuell löscht, wenn die Verzeichnisse nicht vorhanden sind. Sobald wir die vier Dateien ROOT.xml, example.xml, example#example-1.xml und example#example-2.xml angelegt haben und den Server starten, müsste alles wieder funktionieren. Falls das nicht der Fall ist, sollten folgende Dinge mal geprüft werden:

  • muss der Server neu gestartet werden ?
  • existieren doppelte Einträge (server.xml, Context-Datei, als Anwendung in webapp) ?
  • liefert der Browser-Cache noch alte Seiten ?

Ich verwende die Ergebnisse übrigens für die Beispiel-Anwendungen meines Blogs.

Kommentare sind geschlossen.