ReloadingClassLoaderでクラスの再読み込みを高速に

2007–11–27

今日は体調を崩した嫁の看病。そんな合間にWicketのソースを読んでた。 今日気になったのは ReloadingClassLoader 。 WicketFilter(package org.apache.wicket.protocol.http)のソースを追っててたどり着いたんだけど、 ReloadingClassLoaderはWicketお手製のClassLoader。 ClassLoaderってのはその名の通りファイルシステムからリソースをロードする役目を負ってる。

Tomcat上で稼働させる場合、ウェブアプリのフォルダ内のリソースはWebappクラスローダーによりロードされる。 これをWicketお手製のクラスローダーに行なわすことが出来る。 これによりアプリケーションごと再起動するTomcatのauto-reloadよりもクラスのリロードが高速になり、 リソース変更の反映も高速になる。 開発時なんかは特におすすめだと思う。

まず ReloadingWicketFilter を継承したクラスを作成し(例ではMyWicketFilter)、 includePatternメソッドの引数に、 ReloadingClassLoaderに管理させたいリソースを指定する。 ワイルドカードも指定可。

package org.gside.wse;

import org.apache.wicket.application.ReloadingClassLoader;
import org.apache.wicket.protocol.http.ReloadingWicketFilter;

public class MyWicketFilter extends ReloadingWicketFilter {
	static
	{
		ReloadingClassLoader.includePattern("org.gside.sample.*");
	}
}	  

web.xmlでは、上記 MyWicketFilterクラスを指定するようにする。

<display-name>sample</display-name>
  <filter>
    <filter-name>sample</filter-name>
    <filter-class>org.gside.sample.MyWicketFilter</filter-class>
    <init-param>
      <param-name>applicationClassName</param-name>
      <param-value>org.gside.sample.WseApplication</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>sample</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>