Url Rewrite Filter その4 run要素を使うときはjarをshared/libに置いちゃダメ

Url Rewrite Filterにはrun要素というのがあって、

<rule>
    <from>^/world/[a-z]+/[a-z]+$</from>
    <run class="com.blah.web.WorldServlet" method="doGet" />
    <to>/world-presentation.jsp</to>
</rule>

こんな感じで記述してやると、指定したクラスの指定したメソッド*1を実行できますが、
これを使う場合はUrl Rewrite Filterのjarをshared/libに置いてはダメで、
WEB-INF/lib配下に置いてwarに含めてやらないといけないよーだ。


WEB-INF/classes配下に置かれたクラスはアプリのクラスローダからじゃないとロードできないけど、
この辺に書いてあるように、アプリのクラスローダはSharedのクラスローダの子供なので、
SharedのクラスローダにロードされたUrl Rewrite Filterのクラスから呼び出そうにも、
Sharedのクラスローダではロードできないし、↓のような順番で委譲されるので、

  1. Webアプリケーション自身のクラスローダ
  2. Commonクラスローダ
  3. Sharedクラスローダ
  4. システム・クラスローダ
  5. ブートストラップ・クラスローダ

Sharedのクラスローダからアプリのクラスローダに委譲は行われない。
で、アウトということらしい。


そう言えばCommons Digesterでも似たようなことがあったっけ。
こいつらについてはそういうもんだと諦めるとして、アプリのクラスを触る可能性のあるライブラリで、
これを回避できるようなライブラリ作成側での対処法みたいのはあるのだろうか?
気に留めておいて調べてみようかと思う。

*1:HttpServletのdo何某メソッドと同じシグニチャのメソッド