Resourcesコンポーネント

目次

はじめに

Resources要素は、Webアプリケーションで利用可能なすべてのリソースを表します。これには、クラス、JARファイル、HTML、JSP、およびWebアプリケーションに貢献するその他のファイルが含まれます。これらのリソースのソースとしてディレクトリ、JARファイル、WARを使用する実装が提供されており、リソースの実装は、データベースやバージョン管理されたリポジトリに保存されたファイルなどの他の形式のファイルをサポートするように拡張できます。

リソースはデフォルトでキャッシュされます。

注: ファイルシステムに基づかないResources実装でWebアプリケーションを実行できるのは、Webアプリケーションが自身のリソースへの直接ファイルシステムアクセスに依存せず、ServletContextインターフェースのメソッドを使用してそれらにアクセスする場合のみです。

Resources要素は、Contextコンポーネント内にネストすることができます。含まれていない場合、デフォルトのファイルシステムベースのResourcesが自動的に作成され、これはほとんどの要件で十分です。

属性

共通属性

Resourcesのすべての実装は以下の属性をサポートします

属性説明
allowLinking

このフラグの値がtrueの場合、Webアプリケーションの内部で、Webアプリケーションのベースパスの内外のリソースを指すシンボリックリンクが許可されます。指定されていない場合、このフラグのデフォルト値はfalseです。

注意: このフラグは、Windowsプラットフォーム(または大文字小文字を区別するファイルシステムを持たないその他のOS)ではtrueに設定してはなりません。これにより、大文字小文字の区別チェックが無効になり、JSPソースコードの開示などのセキュリティ問題が発生する可能性があります。

archiveIndexStrategy

これがsimpleの場合、Context内のuseBloomFilterForArchivesが明示的に定義されていない限り、JARアーカイブのルックアップにはハッシュマップが使用されます。

これがbloomの場合、アーカイブのルックアップを高速化するためにブルームフィルタが使用されます。これは、非常に多くのJARを含むWebアプリケーションのデプロイ速度に有益です。

これがpurgedの場合、アーカイブのルックアップを高速化するためにブルームフィルタが使用されますが、実行時にパージすることができます。ブルームフィルタの再初期化を避けるために、bloomを使用することをお勧めします。

指定されていない場合、デフォルト値のsimpleが使用されます。

cacheMaxSize

静的リソースキャッシュの最大サイズ(キロバイト単位)。指定されていない場合、デフォルト値は10240(10 MiB)です。この値は、Webアプリケーションの実行中に変更できます(例:JMX経由)。キャッシュが新しい制限よりも多くのメモリを使用している場合、キャッシュは新しい制限を満たすように時間の経過とともにサイズを削減しようとします。必要に応じて、cacheObjectMaxSizecacheMaxSize/20より大きくならないように削減されます。

cacheObjectMaxSize

キャッシュに配置される静的リソースの最大サイズ。指定されていない場合、デフォルト値は512(512キロバイト)です。この値がcacheMaxSize/20より大きい場合、cacheMaxSize/20に削減されます。この値は、Webアプリケーションの実行中に変更できます(例:JMX経由)。

cacheTtl

キャッシュエントリの再検証間の時間(ミリ秒単位)。指定されていない場合、デフォルト値は5000(5秒)です。この値は、Webアプリケーションの実行中に変更できます(例:JMX経由)。リソースがキャッシュされると、キャッシュされた時点でのTTLを継承し、この属性に対するその後の変更に関わらず、リソースがキャッシュから削除されるまでそのTTLを保持します。

cachingAllowed

このフラグの値がtrueの場合、静的リソースのキャッシュが使用されます。指定されていない場合、このフラグのデフォルト値はtrueです。この値は、Webアプリケーションの実行中に変更できます(例:JMX経由)。キャッシュが無効になっている場合、現在キャッシュにあるリソースはキャッシュからクリアされます。

className

使用する実装のJavaクラス名。このクラスはorg.apache.catalina.WebResourceRootインターフェースを実装する必要があります。指定されていない場合、標準値(以下で定義)が使用されます。

readOnly

このフラグの値がtrueの場合、メインリソースセットへの書き込みが無効になります。デフォルト値はfalseです。

trackLockedFiles

ロックされたファイルを追跡する機能が有効になっているかどうかを制御します。有効になっている場合、ファイルをロックし、そのロックを解除するためにクローズする必要があるオブジェクトを返すメソッド(例:ServletContext.getResourceAsStream())へのすべての呼び出しは、追加のタスクを実行します。

  • メソッドが呼び出された時点のスタックトレースが記録され、返されたオブジェクトと関連付けられます。
  • 返されたオブジェクトは、リソースを解放するためにclose()(または同等のメソッド)が呼び出された時点を検出できるようにラップされます。リソースが解放されると、オブジェクトの追跡は停止します。
  • Webアプリケーションのシャットダウン時に残っているすべてのロックされたリソースは、ログに記録され、その後クローズされます。

指定されていない場合、デフォルト値のfalseが使用されます。

標準実装

標準ルート実装

Resourcesの標準実装はorg.apache.catalina.webresources.StandardRootです。追加の属性はサポートしていません。

抽出ルート実装

Resourcesの抽出実装はorg.apache.catalina.webresources.ExtractingRootです。追加の属性はサポートしていません。

WebアプリケーションをパックされたWARファイルとしてデプロイする場合、抽出ルートは/WEB-INF/libからすべてのJARファイルをWebアプリケーションの作業ディレクトリにあるapplication-jarsディレクトリに抽出します。これらの抽出されたJARは、Webアプリケーションが停止するときに削除されます。

パックされたWARからJARファイルを抽出すると、特にアプリケーションがJARスキャンを必要とするWebアプリケーションの起動時に、パフォーマンスが向上する可能性があります。

ネストされたコンポーネント

Webアプリケーションのメインリソースは、Contextで定義されたdocBaseによって定義されます。追加の設定やリソースは、1つ以上のネストされたコンポーネントを定義することによってWebアプリケーションで利用可能にすることができます。

PreResources

PreResourcesはメインリソースの前に検索されます。これらは定義された順序で検索されます。PreResourcesを設定するには、<Resources>要素の内部に<PreResources>要素を以下の属性と共にネストします

属性説明
allowLinking

このフラグの値がtrueの場合、Webリソースセット内で、Webアプリケーションのベースパスの内外のリソースを指すシンボリックリンクが許可されます。指定されていない場合、このフラグのデフォルト値は外側のResources実装から取得されます。

この属性はDirResourceSetおよびFileResourceSetでのみ利用可能です。

注意: このフラグは、Windowsプラットフォーム(または大文字小文字を区別するファイルシステムを持たないその他のOS)ではtrueに設定してはなりません。これにより、大文字小文字の区別チェックが無効になり、JSPソースコードの開示などのセキュリティ問題が発生する可能性があります。

base

使用するリソースがどこに配置されているかを識別します。この属性はTomcatが提供するorg.apache.catalina.WebResourceSet実装で必須であり、リソースが配置されているファイル、ディレクトリ、またはJARへの絶対パスを指定する必要があります。カスタム実装では必要ない場合があります。

className

使用する実装のJavaクラス名。このクラスはorg.apache.catalina.WebResourceSetインターフェースを実装する必要があります。Tomcatは3つの標準実装を提供します:org.apache.catalina.webresources.DirResourceSetorg.apache.catalina.webresources.FileResourceSet、およびorg.apache.catalina.webresources.JarResourceSet。カスタム実装も使用できます。

internalPath

base内のリソースが見つかるパスを識別します。これは通常、リソースがJARのルートにない場合(リソースJARの場合など)にのみJARファイルで使用されます。この属性はTomcatが提供するorg.apache.catalina.WebResourceSet実装で必須であり、'/'で始まる必要があります。カスタム実装では必要ない場合があります。指定されていない場合、デフォルト値の'/'が使用されます。

readOnly

trueの場合、このリソースセット内のリソースは削除、作成、変更できません。org.apache.catalina.webresources.JarResourceSetのインスタンスの場合、この属性はtrueにハードコードされており、変更できません。org.apache.catalina.webresources.DirResourceSetおよびorg.apache.catalina.webresources.FileResourceSetのインスタンスの場合、この属性のデフォルト値はfalseです。

webAppMount

これらのリソースが利用可能になるWebアプリケーション内のパスを識別します。Tomcatが提供するorg.apache.catalina.WebResourceSet実装の場合、この属性は必須であり、'/'で始まる必要があります。カスタム実装では必要ない場合があります。指定されていない場合、デフォルト値の'/'が使用されます。

JARリソース

JarResourcesはメインリソースの後に検索されますが、PostResourcesの前に検索されます。これらは定義された順序で検索されます。JarResourcesを設定するには、<Resources>要素の内部に<JarResources>要素をネストします。設定属性はPreResourcesと同じです。

Webアプリケーションの起動中、JARスキャンプロセスはスキャンされたJARの/META-INF/resources下のコンテンツをチェックします。見つかった場合、この静的コンテンツはJarResourcesに追加されます。

Post-resources

PostResourcesはリソースJARの後に検索されます。これらは定義された順序で検索されます。PostResourcesを設定するには、<Resources>要素の内部に<PostResources>要素をネストします。設定属性はPreResourcesと同じです。

順序

上記のリソースセットに加えて、標準実装は/WEB-INF/classesにマッピングされたJARファイルに含まれるクラスを表すClassResourcesも保持します。これにより、他のコンポーネントは、/WEB-INF/classesを検索するための1回の呼び出しに続いて/WEB-INF/lib内のJARを検索するための別の呼び出しを行う代わりに、単一の呼び出しでクラスを検索できます。Webアプリケーションが起動すると、ClassResourcesは/WEB-INF/libにマッピングされたJARから生成されます。

したがって、完全な検索順序は次のとおりです

  • PreResources
  • MainResources
  • ClassResources
  • JarResources
  • PostResources

Webアプリケーション起動時のClassResourcesおよびJarResourcesの生成は、目的の動作を得るためにJARベースのリソースを正しく追加するよう注意が必要であることを意味します。次の例を考えてみましょう

<Resources>
  <PostResources base="D:\Projects\external\classes"
                 className="org.apache.catalina.webresources.DirResourceSet"
                 webAppMount="/WEB-INF/classes"/>
  <PostResources base="D:\Projects\lib\library1.jar"
                 className="org.apache.catalina.webresources.FileResourceSet"
                 webAppMount="/WEB-INF/lib/library1.jar"/>
</Resources>

両方のリソースがPostResourcesであるため、D:\Projects\lib\library1.jarよりも前にD:\Projects\external\classesがクラスの検索対象となると予想されるかもしれません。しかし、FileResourceSetを使用してJARを追加すると、JARは/WEB-INF/libにマッピングされ、アプリケーション起動時に/WEB-INF/lib内の他のJARと共に処理されます。JARファイルからのクラスはClassResourcesに追加され、これはD:\Projects\external\classesからのクラスよりも先に検索されることを意味します。D:\Projects\external\classesD:\Projects\lib\library1.jarよりも先に検索されることが望ましい動作である場合は、わずかに異なる設定が必要です

<Resources>
  <PostResources base="D:\Projects\external\classes"
                 className="org.apache.catalina.webresources.DirResourceSet"
                 webAppMount="/WEB-INF/classes"/>
  <PostResources base="D:\Projects\lib\library1.jar"
                 className="org.apache.catalina.webresources.JarResourceSet"
                 webAppMount="/WEB-INF/classes"/>
</Resources>

要するに、JARファイルはFileResourceSetを使用して/WEB-INF/libにマッピングするのではなく、JarResourceSetとして/WEB-INF/classesにマッピングして追加する必要があります。

キャッシュ戦略

静的リソースのキャッシングに対する追加の制御は、カスタムキャッシュ戦略を構成することで実現できます。カスタムキャッシュ戦略を構成するには、<Resources>要素の内部に<CacheStrategy>要素を以下の属性と共にネストします

属性説明
className

使用する実装のJavaクラス名。このクラスはorg.apache.catalina.WebResourceRoot$CacheStrategyインターフェースを実装する必要があります。

特別な機能

Resources要素には特別な機能は関連付けられていません。