Um den Tomcat-Klassenlader zu erlernen, müssen Sie sich zunächst mehrere von der JVM bereitgestellte Klassenlader ansehen. Schließlich hängt der Tomcat-Klassenlader vom JVM-Klassenlader ab.
JVM-Klassenlader: Bootstrap-Klassenlader, Erweiterungs-Klassenlader, System-Klassenlader (auch als Anwendungs-Klassenlader, System-Klassenlader bekannt). Der Bootstrap-Klassenlader ist der übergeordnete Klassenlader der Erweiterung, der wiederum der übergeordnete Klassenlader des Systems ist.
(1) Bootstrap Classloader wird von JVM in C-Sprache mithilfe von JNI implementiert (d. h. es ist keine Unterklasse von Java.lang.ClassLoader). Verantwortlich für das Laden der Klassenbibliothek unter %JAVA_HOME%lib oder der durch die Option -Xbootclasspath angegebenen Klasse oder die Verwendung der Option -D zur Angabe der Systemeigenschaft sun.boot.class.path.
(2) Die Erweiterung ClassLoader wird von sun.misc.Launcher$ExtClassLoader implementiert und ist für das Laden der Klassenbibliothek in %JAVA_HOME%jrelibext oder der durch die Systemvariable java.ext.dirs angegebenen Klassenbibliothek verantwortlich.
(3) System ClassLoader wird von sum.misc.Launcher$AppClassLoader implementiert und ist für das Laden von Klassen verantwortlich, die an Java-Anwendungen beteiligt sind. Der Loader kann über ClassLoader.getSystemClassLoader() abgerufen werden
Beim Start von Tomcat werden mehrere Klassenlader erstellt:
1 Der Bootstrap-Boot-Klassenlader
lädt die für den JVM-Start erforderlichen Klassen sowie Standarderweiterungsklassen, die sich unter jre/lib/ext befinden.
2 System-Systemklassenlader
Lädt von Tomcat gestartete Klassen, z. B. bootstrap.jar, normalerweise in catalina.bat oder catalina.sh angegeben. Befindet sich unter CATALINA_HOME/bin.
3 Gemeinsamer universeller Klassenlader
Lädt einige für Tomcat und Anwendungen gemeinsame Klassen, die sich unter CATALINA_HOME/lib befinden, wie z. B. Servlet -api.jar
4 Webapp-Anwendungsklassenlader
Nachdem jede Anwendung bereitgestellt wurde, ein eindeutiger Klassenlader. Dieser Klassenlader lädt die Klasse in die JAR-Datei unter WEB-INF/lib und die Klassendatei unter WEB-INF/classes.
Wenn die Anwendung eine bestimmte Klasse benötigt, wird die Klasse in der folgenden Reihenfolge geladen :
1 Verwenden Sie Bootstrap, um den Klassenlader zu laden
2 Verwenden Sie den Systemklassenlader zum Laden
3 Verwenden Sie den Anwendungsklassenlader zum Laden in WEB-INF/classes
4 Verwenden Sie den Anwendungsklassenlader zum Laden in WEB-INF/lib
5 Verwenden Sie den allgemeinen Klassenlader, um
in CATALINA_HOME/lib zu laden. Ein weiterer zu erwähnender Punkt ist, dass das Platzieren von Java-Dateien im Ordner src in Eclipse den Klassen im JAR-Paket Priorität einräumt:
Dies liegt daran, dass die Java-Datei im src-Ordner in Eclipse und die JSP in webContent in Klassendateien kompiliert und beim Start von Tomcat in WEB-INF/class abgelegt werden. Das von Eclipse extern referenzierte JAR-Paket entspricht der Platzierung in WEB-INF/lib. Daher müssen aus Java-Dateien oder JSP-Dateien kompilierte Klassen zuerst geladen werden .
Beachten Sie außerdem, dass in CATALINA_HOME/lib und WEB-INF/lib unterschiedliche Versionen von JAR-Paketen abgelegt sind. Dies führt in einigen Fällen zu einem Fehler, der dazu führt, dass die Klasse nicht geladen werden kann.
Außerdem kann es zu Fehlern beim Laden von Klassen zwischen mehreren Anwendungen kommen, wenn mehrere Anwendungen dieselbe JAR-Paketdatei verwenden und mehrere Kopien platziert werden.
Das obige ist der detaillierte Inhalt vonEinführung in mehrere Klassenlader in Tomcat. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!