ルース・アプリケーション
ルース・アプリケーションとは、複数の物理ロケーションから構成されるアプリケーションのことであり、XML ファイルを介してランタイムに提供されます。ルース・アプリケーションは Java™ EE および OSGi アプリケーションでサポートされ、開発環境で特に役立ちます。
通常のアプリケーション
- ライブラリー Java アーカイブ (JAR) ファイルは、WEB-INF/lib に保管されます
- クラスは、ライブラリー JAR ファイルまたは WEB-INF/classes 内に配置されます
- デプロイメント記述子は WEB-INF/web.xml に配置されます
- 提供するコンテンツは、ディレクトリーのルートから検索されます
ルース・アプリケーション
ルース・アプリケーションは、「情報を任意の場所に配置できる、アプリケーションを表す仮想ディレクトリー」と説明されます。これにより、開発ツール (WebSphere® Application Server Developer Tools など) で、関連ファイルがエクスポートされるのではなく、ワークスペースから直接ロードされるアプリケーションを実行できます。関連ファイルの例としては、Java クラス、JavaServer Pages、イメージが挙げられます。関連ファイルをワークスペースから直接ロードした場合、ビルド、実行、デバッグのサイクルの時間が短縮されます。 コンテンツは単一のディレクトリーに配置されるのではなく、他の場所から取得できます。この場所は、XML 構成ファイルで指定します。
- 接尾部 .xml を付加して、アプリケーション構成エレメントの location 属性に XML ファイルを配置する
- アプリケーションの dropins フォルダーに XML ファイルを直接配置する
ルース・アプリケーション構成ファイル
- アプリケーション内の任意の場所に任意の物理ディレクトリーをマップする
- アプリケーション内の任意の場所に任意の物理ファイルをマップする
- ネストされたアーカイブとして任意の場所に任意の物理 JAR ファイルまたはディレクトリーをマップする
- 単一のターゲット・ロケーションに複数の物理ソースをマップする (マージ)
- Eclipse プロジェクト内のフォルダーなど、ディスク上の単一の場所にアーカイブのルートをマップする
- WEB-INF/classes フォルダーに、通常の場所にない Java bin/output フォルダーをマップする。この場所は、ワークスペースの設定、企業ガイドライン、ソース制御プロジェクト・レイアウト・ガイドラインなどに応じて、異なるフォルダーにすることができます。 同じプロジェクトで複数の Java ソースおよび出力の場所を使用し、それらをともに WEB-INF/classes にマップできます。
- 「外部」JAR ファイルをアプリケーションにマップする。この「外部」JAR ファイルは、以下のいずれかにすることができます。
- WEB-INF/lib 内の JAR ファイルのように扱う別個の Java プロジェクト
- .war ファイルをビルドしたハード・ディスク上の他の場所にあり、実行時に WEB-INF/lib に含める必要があるユーティリティー JAR ファイル
ルース・アプリケーション構成ファイルの例
- <archive> (アーカイブ用)
- <file> (ファイル用)
- <dir> (ディレクトリー用)
- アーカイブ
- <archive> エレメントは常に、ルース・アプリケーション構成ファイルのルートとして使用されます。これは、XML で表される仮想ファイル・システムのルートでもあります。ルートの <archive> エレメントの下に 3 つのエレメントのいずれかをネストできます。ルートの <archive> エレメントには、属性は含まれません。
- archive エレメントは、再帰的にネストできます。ルートの <archive> エレメントの下にネストされた <archive> エレメントでは、targetInArchive 属性を設定できます。targetInArchive 属性は、ルース定義のルート・アーカイブ内にあるアーカイブのパスを定義します。<archive> エレメントを使用して、アプリケーション内のアーカイブとしてファイル・システム上のアーカイブをマップすることはできません。ルース・アプリケーション構成を使用してディスク上のアーカイブをマップするには、<file> エレメントを使用します。注: targetInArchive 属性の値は、先頭にスラッシュ (/) を付けた絶対パスです。
- 以下のコードでは、ルートの <archive> エレメントの下にもう 1 つの <archive> エレメントがネストされている例を示します。
<archive> <archive targetInArchive="/jarName.jar"> <!-- more objects can be embedded here--> </archive> </archive>
- ファイル
- <file> エレメントを使用して、ルース・アプリケーション構成内のファイルにハード・ディスク上のファイルをマップできます。<file> エレメントでは、以下の属性を設定できます。
- targetInArchive は、ルース定義のルート・アーカイブ内にあるアーカイブのパスを定義します。
- sourceOnDisk は、ファイル・システム上のファイルの実際の場所を定義します。注: sourceOnDisk 属性の値は、絶対ロケーションです。正しく解決される ${example.dir} などの Liberty 変数を使用できます。
- 以下のコードでは、ルース・アプリケーション構成によって /apps/webApplication.war と表されている C:/devFolder/myApplication.zip 内のファイルの例を示します。
<file targetInArchive="/apps/webApplication.war" sourceOnDisk="C:/devFolder/myApplication.zip" />
- 以下のコードでは、パス /apps/webApplication.war のアーカイブを定義している外側のアーカイブの例を示します。
アーカイブ内で、webApplication.war は、パス /applications/myApplications にあるファイル jarName.jar を定義しています。
実際のファイルの場所は、c:¥devFolder¥myApplication.zip になります。
<archive targetInArchive="/apps/webApplication.war"> <file targetInArchive="/applications/myApplications/jarName.jar" sourceOnDisk="C:/devFolder/myApplication.zip" /> </archive>
- ディレクトリー
- <dir> エレメントを使用して、ディスク上のディレクトリーおよびそのすべての内容を、ルース・アプリケーション構成内のディレクトリー・ロケーションにマップできます。このエレメントには、<file> エレメントと同じ属性があり、同じように使用します。
- 以下のコード例は、/META-INF 内および ${example.dir}/applicationData/myApplication にあるファイル・システム上のディレクトリーをルース・アプリケーション構成で示したものです。
<dir targetInArchive="/META-INF" sourceOnDisk="${example.dir}/applicationData/myApplication" />
- ディレクトリーをアーカイブに追加して、/apps/jarName.jar/META-INF 内に置くようにするために、<dir> エレメントを以下のように埋め込みます。
<archive targetInArchive="/apps/jarName.jar"> <dir targetInArchive="/META-INF" sourceOnDisk="${example.dir}/applicationData/myApplication" /> </archive>
- 前の例ではともに、${example.dir}/applicationData/myApplication 内にあるすべてのファイルが、ルース・アプリケーション構成で targetInArchive 属性によってマップされたディレクトリーの下にマップされて可視となります。
仮想パスおよびファイル名
<file> エレメントまたは <dir> エレメントをアーカイブに追加した場合、ルース・アーカイブ内のファイルまたはディレクトリーの名前は、ディスク上の実際の名前と同じである必要はありません。
<archive>
<file targetInArchive="/application.txt"
sourceOnDisk="${example.dir}/applicationFiles/newfile.txt"/>
</archive>
追加するいずれのファイルまたはディレクトリーのパスについても、同じ概念が当てはまります。ディスク上の物理リソースは、宣言されているものに対応するディレクトリー階層内に存在する必要はありません。
<archive>
<file targetInArchive="/only/available/in/application.txt"
sourceOnDisk=""${example.dir}/applicationFiles/newfile.txt"/>
</archive>
<archive>
<file targetInArchive="/only/available/in/red.txt"
sourceOnDisk="${example.dir}/applicationFiles/newfile.txt" />
<archive targetInArchive="/apps/jarName.jar">
<dir targetInArchive="/META-INF"
sourceOnDisk="${example.dir}/applicationData/myApplication" />
</arhive>
</archive>
同じ名前のフォルダーおよびファイル
ルース・アプリケーション構成内の同じ仮想ロケーションに同じ名前のフォルダーが 2 つある場合、それらのフォルダーはマージされ、両フォルダーの内容が使用可能になります。ルース・アーカイブ内に同じターゲット・ロケーションのファイルが 2 つある場合、最初に出現したファイルが使用されます。最初の出現は、トップダウンの方法を使用してルース・アプリケーション構成ファイルのエレメントを読み取って判別されます。
検出された最初のファイルが正しくないファイルであった場合、XML を並べ替えて、必要なバージョンのファイルが含まれているエレメントが最初に処理されるようにします。最初の出現は、<dir> エレメントで定義されているファイル、および <file> エレメントに定義されているファイルに適用されます。同じ名前および仮想ロケーションのファイルの最初の出現は、仮想ファイル・システムから返されたものになります。
ルース・アプリケーションに関する考慮事項
構成されているすべてのルース・アプリケーションで、ファイルは、ディスク上の宣言されている階層内に配置されません。アプリケーションで独自のリソースに直接アクセスし、拡張 war や ear レイアウトの場合のようにそれらのリソースがディスク上に配置されていることを予期した場合、予期しない動作が生じる可能性があります。
アプリケーションで ServletContext.getRealPath を使用して、物理リソース・パスを検出できます。ServletContext.getRealPath により、開いてデータを読み取ったり書き込んだり、ディレクトリーを取得したりするためのファイル・パスを検出できます。 ただし、Web アプリケーションで ServletContext.getRealPath を使用して「/」のパスを取得した場合、そのパスを使用してディスク上でアプリケーションをナビゲートすることはできません。
ServletContext.getRealPath では、単一の物理パスのみを返すことができ、ルース・アプリケーションは、複数のディレクトリーをマージして、アプリケーションが認識できる単一のパスを形成している可能性があります。
<archive>
<dir targetInArchive="/"
sourceOnDisk="c:¥myapplication" />
<dir targetInArchive="/web/pages"
sourceOnDisk="c:¥webpagesforapplication" />
</archive>
/web/pages に直接アクセスし、ディレクトリー階層を上にナビゲートするアプリケーションは、/web/pages の物理パスの親が /web ではなく c:¥ であることを検出します。c:¥ には、ページ・ディレクトリーおよび親ディレクトリーが含まれていません。
これらの考慮事項が当てはまるのは、アプリケーションでディスク上のコンテンツに直接アクセスし、ディスク上の対応する階層レイアウトを想定して独自のパス・ナビゲーションを実行する場合のみです。同じアプリケーションがアーカイブとしてデプロイされている場合、これらのアプリケーションで同様に問題が発生します。このようなアプリケーションでは通常、移植性の問題が生じます。
複雑な例
<archive>
<dir targetInArchive="/appResources"
sourceOnDisk="${example.dir}/applicationFiles" />
<archive targetInArchive="application.jar">
<dir targetInArchive="/src"
sourceOnDisk="${example.dir}/applicationCode/src" />
</archive>
<archive targetInArchive="webApp.war">
<dir targetInArchive="/META-INF"
sourceOnDisk="${example.dir}/manifestFiles/" />
<dir targetInArchive="/WEB-INF"
sourceOnDisk="c:/myWorkspace/webAppProject/web-inf" />
<archive targetInArchive="/WEB-INF/lib/myUtility.jar">
<dir targetInArchive="/"
sourceOnDisk="c:/myWorkspace/myUtilityProject/src" />
<file targetInArchive="/someJar.jar"
sourceOnDisk="c:/myWorkspace/myUtilityProject/aJar.jar" />
</archive>
</archive>
<file targetInArchive="/myjar.jar"
sourceOnDisk="${example.dir}/apps/application.zip" />
</archive>