Tomcat クラスローダーを学ぶには、まず JVM によって提供されるいくつかのクラスローダーを確認する必要があります。結局のところ、Tomcat クラスローダーは JVM クラスローダーに依存しています。
JVM クラスローダー: ブートストラップ クラス ローダー (ブートストラップ クラス ローダー)、拡張クラス ローダー (拡張クラス ローダー)、システム クラス ローダー (アプリケーション クラス ローダー、システム クラス ローダーとも呼ばれます)。ブートストラップ クラス ローダーは拡張クラス ローダーの親であり、拡張クラス ローダーはシステム クラス ローダーの親です。
(1) ブートストラップ クラスローダーは、JNI を使用して C 言語の JVM によって実装されます (つまり、Java.lang.ClassLoader のサブクラスではありません)。 %JAVA_HOME%lib の下のクラス ライブラリ、または -Xbootclasspath オプションで指定されたクラス、または -D オプションを使用して sun.boot.class.path システム プロパティを指定したクラスをロードします。
(2) 拡張 ClassLoader は sun.misc.Launcher$ExtClassLoader によって実装され、%JAVA_HOME%jrelibext 内のクラス ライブラリ、またはシステム変数 java.ext.dirs で指定されたクラス ライブラリをロードします。
(3) System ClassLoader は sum.misc.Launcher$AppClassLoader によって実装され、Java アプリケーションに関連するクラスのロードを担当します。ローダーは ClassLoader.getSystemClassLoader() を通じて取得できます
Tomcat が起動すると、いくつかのクラス ローダーが作成されます:
1 ブートストラップ ブート クラス ローダー
JVM の起動に必要なクラスをロードします。 jre/lib/ext の下にあるクラス。
2 システム システム クラス ローダー
通常、catalina.bat または catalina.sh で指定される bootstrap.jar など、Tomcat によって開始されるクラスをロードします。 CATALINA_HOME/bin にあります。 3 Common Universal Classローダー各アプリケーションがデプロイされた後、固有のクラス ローダーが作成されます。このクラスローダーは、
WEB-INF/lib の下にある jar ファイル内のクラスと、WEB-INF/classes の下にあるクラスファイル
をロードします。アプリケーションで特定のクラスが必要な場合、クラスは次の順序でロードされます
: 1 ブートストラップ クラス ローダーを使用してロードします2 システム クラス ローダーを使用してロードします
3 アプリケーション クラス ローダーを使用しますサーバーは WEB-INF/classes にロードされます 4 アプリケーション クラス ローダーを使用して WEB-INF/lib にロードします
5 共通クラス ローダーを使用して CATALINA_HOME/lib にロードします もう 1 つ話すべきことは、Java の場合ですファイルが Eclipse の src フォルダーに配置されると、jar パッケージ内のクラスが優先されます: これは、Eclipse の src フォルダー内の Java ファイルと webContent 内の JSP が、Tomcat の起動時にクラス ファイルにコンパイルされるためです。 WEB-INF/クラス内。 Eclipse によって外部参照される jar パッケージは、WEB-INF/lib に配置されるのと同じです。したがって、Java ファイルまたは JSP ファイルからコンパイルされたクラスを最初にロードする必要があります
。また、CATALINA_HOME/libとWEB-INF/libに異なるバージョンのjarパッケージが配置されているため、場合によってはクラスをロードできないエラーが発生することにも注意してください。
また、複数のアプリケーションが同じjarパッケージファイルを使用し、複数のコピーを配置すると、複数のアプリケーション間でクラスロードエラーが発生する可能性があります。以上がTomcat のいくつかのクラスローダーの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。