3.6.2. デプロイメントでのプログラムによるリソースの繰り返し
JBoss Modules ライブラリーは、すべてのデプロイメントリソースを繰り返し処理するために複数の API を提供します。JBossModulesAPI の JavaDoc は次の場所にあります。http://docs.jboss.org/jbossmodules/1.3.0.Final/api/。これらの API を使用するには、以下の依存関係を
MANIFEST.MF
に追加する必要があります。
Dependencies: org.jboss.modulesこれらの API により柔軟性が向上しますが、直接パスを検索するよりも動作がかなり遅くなることに注意してください。
本トピックでは、アプリケーションコードでプログラムを用いてリソースを繰り返す方法を説明します。
- デプロイメント内およびすべてのインポート内のリソースをリストします。
- 場合によっては、正確なパスでリソースを検索できないことがあります。たとえば、正確なパスがわからない場合や、特定のパス内の複数のファイルを調べる必要がある場合があります。このような場合、JBoss Modules ライブラリーはすべてのデプロイメントを繰り返し処理するための API を複数提供します。2 つのメソッドのいずれかを使用すると、デプロイメントでリソースを繰り返し処理できます。
- 単一のモジュールで見つかったすべてのリソースを繰り返し処理します。
- The
ModuleClassLoader.iterateResources()
メソッドは、このモジュールクラ出力ダー内のすべてのリソースを繰り返します。このメソッドは、検索を開始するディレクトリーの名前と、サブディレクトリーで再帰的に処理するかどうかを指定するブール値の 2 つの引数を取ります。以下の例は、ModuleClassLoader の取得方法と、bin/
ディレクトリーにあるリソースのイテレーターの取得方法 (サブディレクトリーを再帰的に検索) を示しています。取得されたイテレーターは、一致した各リソースをチェックし、名前とサイズのクエリー (可能な場合) を行うために使用できます。また、読み取り可能ストリームを開いたり、リソースの URL を取得するために使用できます。例3.12 bin ディレクトリーでリソースを検索し、サブディレクトリーに繰り返します。
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("bin",true);
- 単一のモジュールで見つかったすべてのリソースとインポートされたリソースを繰り返し処理します。
- The
Module.iterateResources()
メソッドは、モジュールにインポートされたリソースを含む、このモジュールクラ出力ダー内のすべてのリソースを繰り返します。このメソッドは、前述のメソッドよりもはるかに大きなセットを返します。このメソッドには、特定パターンの結果を絞り込むフィルターとなる引数が必要になります。代わりに、PathFilters.acceptAll() を指定してセット全体を返すことも可能です。例3.13 インポートを含む、このモジュールのリソースのセット全体を検索します。
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.acceptAll());
- パターンと一致するすべてのリソースを検索します。
- デプロイメント内またはデプロイメントの完全なインポートセット内で特定のリソースのみを見つける必要がある場合は、リソースの繰り返しをフィルターする必要があります。JBoss Modules のフィルター API は、リソースの繰り返しをフィルターする複数のツールを提供します。
- 依存関係の完全セットを確認します。
- 依存関係の完全なセットを調べる必要がある場合は、
Module.iterateResources()
メソッドのPathFilter
各リソースの名前が一致するかどうかを確認するパラメーター。 - デプロイメント依存関係を確認します。
- デプロイメント内のみを調べる必要がある場合は、
ModuleClassLoader.iterateResources()
方法。が、追加のメソッドを使用して結果となるイテレーターをフィルターする必要があります。ThePathFilters.filtered()
この場合、メソッドはリソースイテレータのフィルタリングされたビューを提供できます。PathFilters
クラスには、さまざまな関数を実行するフィルターを作成する多くの静的メソッドが含まれています。これには、子パスや完全一致の検索、Ant 形式の「glob」パターンの一致などが含まれます。
- リソースのフィルターに関する追加のコード例。
- 以下の例は、異なる基準を基にしてリソースをフィルターする方法を示しています。
例3.14 デプロイメントでファイル名が messages.properties のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/messages.properties"), moduleClassLoader.iterateResources("", true));
例3.15 デプロイメントおよびインポートでファイル名が messages.properties のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.match("**/message.properties));
例3.16 デプロイメントでディレクトリー名が my-resources であるディレクトリー内部のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = PathFilters.filtered(PathFilters.match("**/my-resources/**"), moduleClassLoader.iterateResources("", true));
例3.17 デプロイメントおよびインポートで messages または errors という名前のファイルをすべて検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Module module = moduleClassLoader.getModule(); Iterator<Resource> moduleResources = module.iterateResources(PathFilters.any(PathFilters.match("**/messages"), PathFilters.match("**/errors"));
例3.18 デプロイメントで指定のパッケージにあるすべてのファイルを検索
ModuleClassLoader moduleClassLoader = (ModuleClassLoader) TargetClass.class.getClassLoader(); Iterator<Resource> mclResources = moduleClassLoader.iterateResources("path/form/of/packagename", false);