Resources コンポーネント

目次

はじめに

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

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

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

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

属性

共通属性

Resources のすべての実装は、次の属性をサポートします。

属性説明
allowLinking

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

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

cacheMaxSize

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

cacheObjectMaxSize

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

cacheTtl

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

cachingAllowed

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

className

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

trackLockedFiles

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

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

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

archiveIndexStrategy

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

これがbloomの場合、ブルームフィルタを使用してアーカイブのルックアップを高速化します。これは、非常に多くのJARを含むウェブアプリケーションのデプロイ速度に役立ちます。

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

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

標準実装

標準ルート実装

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

抽出ルート実装

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

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

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

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

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

PreResources

PreResourcesは、メインリソースの前に検索されます。定義された順に検索されます。PreResources を設定するには、次の属性を持つ <PreResources> 要素を <Resources> 要素内にネストします。

属性説明
base

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

className

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

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

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

JARリソース

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

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

Postリソース

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

順序

上記で説明したリソースセットに加えて、標準実装では、/WEB-INF/classes にマッピングされたJARファイルに含まれるクラスを表すClassResourcesも保持します。これにより、他のコンポーネントは、/WEB-INF/classesを検索してから/WEB-INF/lib内のJARを検索するという2回の呼び出しを行うのではなく、1回の呼び出しでクラスを検索できます。ClassResourcesは、ウェブアプリケーションの起動時に/WEB-INF/libにマッピングされたJARから読み込まれます。

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

  • PreResources
  • MainResources
  • ClassResources
  • JarResources
  • PostResources

ウェブアプリケーションの起動時に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\external\classesD:\Projects\lib\library1.jarよりも先に検索されると予想されるかもしれません。しかし、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にマッピングして追加するのではなく、/WEB-INF/classesにマッピングされたJarResourceSetとして追加する必要があります。

キャッシュ戦略

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

属性説明
className

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

特殊機能

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