webapps配下でないディレクトリにリソースを置く

Tomcatで、ウェブアプリで使われるリソースをwebapps配下でないディレクトリに置きたい場合あります。
例えば、リソース(画像やJSPなど)をアップロードしてウェブアプリの画面を動的に構成したい時です。
またお客様がウェブアプリ本体のソースを修正することなく、カスタマイズできるようにしたい時もありますね。

もし、そういうリソースをwebapps配下におくと、
ウェブアプリをデプロイするたびに既存のリソースが消えてしまうので、困りますね。

こういう場合、Tomcat8に追加されたResources Componentを使えばいいです。
以下のようにserver.xmlのContext要素配下にResources要素とその下のPostResources要素を追加します。

<Context docBase="myweb" path="" reloadable="false">
    <Resources allowLinking="false">
        <PostResources
            className="org.apache.catalina.webresources.DirResourceSet"
            base="${other}/myres"
            webAppMount="/myres" />
    </Resources>
</Context>

PostResourcesのbaseにはリソースが位置する絶対パスを指定します。
${other}のようにJVMシステムプロパティを指定することもできます。

webAppMountにはURLのパス(ウェブアプリのルートパスで次の部分)を指定します。
上記の場合、URLの後ろに/myresと入力した場合、
baseディレクトリにあるリソースを読み込んでレスポンスとして返します。

リソースの位置がwebappsでないだけで、既存webapps配下にあるリソースとまったく同じです。
良い機能ですね。