How Tomcat Works その5

Chapter 8 : Loader

本も中盤に差し掛かり、ついにLoaderが登場しました。ちなみにLoaderは「Webアプリケーションのローダ」で、実装クラスはWebappLoaderです。クラスローダはLoaderが保持する一要素、という位置づけで、実装クラスはWebappClassLoaderです。
J2EEでクラスローダの問題が起こりがちなのはEAR, WAR, EJB-JARと複数種類のモジュールがあり、パッキングや競合にもいろんなバリエーションがあるからでしょう。TomcatでWARだけ使っている分にはそれほど問題はないと思います。逆にシンプルなので、クラスローダの仕組みを見るには適しています。

WebappClassLoaderはURLClassLoaderを継承し、Webアプリケーションのリポジトリ(WEB-INF/classes、WEB-INF/lib)からクラスを読み込むように実装されています。ポイントは

  • クラスロードの委譲の流れとして、システムクラスローダ→自分→親クラスローダ(/common/libなどを読むStandardClassLoaderたち)という順序でクラスを探す。
    • ただし「javax」「org.apache.xerces」などのパッケージのクラスの検索は自分より親が先になる
  • (reloadableがtrueなら)リソースの変更検知のために、スレッドを起動する
    • リソースが変更されていたらContext.reload()が呼ばれ、クラスローダが再生成される

といったところです。