Kurze Einführung in ClassLoader – Teil 4
Der Servlet Container Apache Tomcat ist die Referenzimplementierung der Servlet- und JSP-API. In ihm laufen Webapplikationen, die zur Laufzeit installiert (“deployed”) und deinstalliert (“undeployed”) werden können. Damit das funktioniert, muss Tomcat für jede Webapplikation einen eigenen ClassLoader zur Verfügung stellen. Zudem kann es Klassen geben, die von mehreren Webapplikationen gemeinsam verwendet werden.
Tomcat löst diese Anforderungen durch folgende ClassLoader Hierarchie:

Common:
Alle Klassen im /common Verzeichnis des Servers sind sowohl in den Webapplikationen und für Tomcat selbst sichtbar. Hier werden üblicherweise Datenbank-Treiber abgelegt. Entwickler sollten hier keine eigenen JAR-Dateien platzieren, um eventuelle Kompatibilitätskonflikte mit Tomcat zu vermeiden.
Shared:
Die im /shared Verzeichnis befindlichen Klassen stehen allen Webapplikationen zur Verfügung. Sie müssen diese Klassen dann nicht mehr selbst mitbringen. Ein weitere Anwendungszweck ist die Kommunikation zwischen Webapplikationen oder der Einsatz von Singletons, die von mehreren Webapplikationen benötigt werden.
Server:
Die vom Tomcat Server benötigten Klassen befinden sich im /server Verzeichnis. Die Webapplikationen haben keinen Zugriff darauf.
WebApp:
Jede Webapplikation besitzt einen eigenen ClassLoader, der unterhalb vom Shared ClassLoader liegt. Interessant ist, dass hier der Delegationsmechanismus umgekehrt wird:
It is recommended also that the application class loader be implemented so
that classes and resources packaged within the WAR are loaded in preference to
classes and resources residing in container-wide library JARs.
Auf gut deutsch: Der ClassLoader der Webapplikation versucht zuerst die Klasse zu laden und erst dann wird delegiert. Somit können Webapplikationen Klassen vom Shared oder Common ClassLoader “überschreiben” (z.B. um zu garantieren, dass genau eine bestimmte Version einer Library zum Einsatz kommt).
Mehr zum Thema ClassLoader im Tomcat gibts direkt auf der Tomcat-Homepage. Soweit so gut. Mit diesem Teil ist die ClassLoader – Reihe vorerst abgeschlossen
P.S.: Noch ein Blogtipp von mir: Auf http://leo.freeflux.net/blog gibts ebenfalls interessante Javaartikel.
June 22nd, 2006 at 1:33 pm
Vielen Dank für den Link. Die Classloader-Reihe war sehr interessant.
June 22nd, 2006 at 7:44 pm
Gern geschehen. Es freut mich dass die Reihe jemand gelesen und verstanden hat
July 20th, 2006 at 6:16 pm
Im context.xml der Web-Applikation kann im Loader Tag mit dem Attribut \”delegate\” bestimmt werden, ob die Klassen der Web-Applikation vor oder nach dem Shared-ClassLoader geladen werden sollen.
siehe dazu http://tomcat.apache.org/tomcat-5.5-doc/config/loader.html
January 2nd, 2007 at 3:10 pm
Sehr schön beschreiben.
Leider lassen sich die Bilder nicht laden.
January 2nd, 2007 at 6:19 pm
Behoben. Vielen Dank für den Hinweis