Was ist ein class path/class loader in Tomcat?

07.04.2017
Tomcat installiert viele class loaders (eine Klasse, die java.lang.ClassLoader) implementiert, damit Webapplikationen, die auf dem Tomcat laufen, Zugriff zu verschiedenen Klassen und Ressourcen haben.
Ein Klassenpfad (class path) ist ein Argument, welches der Java Virtual Machine mitteilt, wo es die Klassen und Pakete findet, welches es für die Ausführung der Applikation benötigt. Diese Aufgabe hat man bewusst vom eigentlichen Java Programm separiert, damit man die Einstellungen von aussen machen und so die Applikation auf verschiedenen Systemen zum laufen bringen kann.
Eltern-Kind Beziehung
In Java sind class loaders in einer Eltern-Kind Beziehung (parent-child). Wenn ein class loader eine Klasse laden muss, dann gibt er diesen Auftrag normalerweise zuerst an den parent class loader weiter. Nur wenn dieser die Klasse nicht findet, schaut er in seinem eigenen Repository.
Die verschiedenen Stufen bei Tomcat sind:
Bootstrap -> System -> Common -> Webapplikationen
Wobei die Eltern jeweils links und die Kinder rechts sind.
Wie verwendet Tomcat den Klassenpfad?
Tomcat will es einem grundsätzlich so einfach wie möglich machen. Wenn Tomcat gestartet wird, ignoriert Tomcat erst mal knallhart die Java classpath Umgebungsvariable, wo Abhängigkeiten normalerweise drinstehen. Stattdessen macht Tomcat seine eigenen Klassenpfade, wenn er den System class loader erstellt.
Deklariert man also einen Klassenpfad in der Umgebungsvariable, muss man sich nicht wundern, wenn Tomcat diese beim Starten überschrieben hat.
Folgende Schritte macht Tomcat beim Starten:
1. Die JVM ladet zuerst die Java Bibliotheken und die Umgebungsvariablen wie JAVA_HOME.
2. Tomcat erstellt seine classloader, welche alle Klassen und JAR Dateien in den beiden Ordner WEB-INF/classed und WEB-INF/lib ladet. Diese Ressourcen sind dabei nur sichtbar von den Webapplikationen, welche diese laden.
3. Der „Common class loader“ von Tomcat ladet alle Klassen und JAR Dateien in $CATALINA_HOME/lib. Diese Ressourcen sieht dann der Tomcat plus alle Applikationen, die darauf laufen.
Und wenn ich die Einstellungen ändern will?
Zum Glück sind die Einstellungen von Tomcat nicht hartcodiert, sondern werden von Catalina’s zentraler Optionsdatei geladen. Diese liegt in $CATALINA_HOME/conf/catalina.properties.
In dieser Datei kann man, wenn dies nötig ist, externe Repositories angeben, welche geladen werden sollen. Dafür kann etwa der shared loader verwendet werden. Die Klassen werden dabei vom shared loader am Ende des Startprozesses geladen, also auch nach dem Common loader.
Um etwa eine externe JAR Datei als Klassen Repository zu verwenden, trage beim Shared Loader ein:
shared.loader=file:/pfad/zur/datei/meinJar.jar
Eine gute Anwendung des Shared Loaders kann man in meinem Artikel Zwei WARs kommunizieren auf einem Tomcat nachlesen.