ModuleFinder
は、resolutionまたは「サービス・バインディング」の間にモジュールを見つけるために使用されます。
ModuleFinder
は、特定の名前のモジュールを1つしか見つけることができません。 たとえば、一連のディレクトリ内のモジュールを検出するModuleFinder
は、指定された名前のモジュールの最初のオカレンスを探し出し、そのディレクトリの後のディレクトリに表示されるその名前の他のモジュールを無視します。
使用例:
Path dir1 = ..., dir2 = ..., dir3 = ...;
ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
Optional<ModuleReference> omref = finder.find("jdk.foo");
omref.ifPresent(mref -> ... );
ここで定義されているfind
とfindAll
メソッドはいくつかの理由で失敗することがあります。 これには、I/Oエラー、モジュール記述子(module-info.class
)の解析で検出されたエラー、またはModuleFinder.of
によって返されたModuleFinder
の場合、同じ名前を持つ2つ以上のモジュールがディレクトリに存在することが含まれます。 エラーが検出されると、これらのメソッドはFindException
を適切なcause
でスローします。 FindException
がスローされた後のModuleFinder
の動作は定義されていません。 たとえば、例外がスローされた後にfind
を呼び出すと、例外につながる同じモジュールがスキャンされる場合とされない場合があります。 例外がスローされた後にモジュール・ファインダを破棄することをお勧めします。
ModuleFinder
はスレッド・セーフである必要はありません。
- 導入されたバージョン:
- 9
-
メソッドのサマリー
修飾子と型メソッド説明static ModuleFinder
compose
(ModuleFinder... finders) 0個以上のモジュール・ファインダのシーケンスから構成されるモジュール・ファインダを返します。指定された名前のモジュールへの参照を検索します。findAll()
このファインダが見つけることができるすべてのモジュール参照のセットを返します。static ModuleFinder
一連のディレクトリおよび/またはパッケージ化されたモジュールを検索して、ファイル・システム上のモジュールを見つけるモジュール・ファインダを返します。static ModuleFinder
ofSystem()
「システム・モジュール」を見つけるモジュール・ファインダを返します。
-
メソッドの詳細
-
find
Optional<ModuleReference> find(String name) 指定された名前のモジュールへの参照を検索します。ModuleFinder
は、モジュールが見つかる一貫したビューを提供します。find
が複数回呼び出されて同じモジュール(名前で)が見つかった場合、毎回同じ結果が返されます。 モジュールがある場合、findAll
メソッドによって返されたモジュールのセットのメンバーであることが保証されます。- パラメータ:
name
- 検索するモジュールの名前- 戻り値:
- 指定された名前のモジュールへの参照、または見つからなければ空の
Optional
- 例外:
FindException
- モジュールを見つける際にエラーが発生した場合SecurityException
- セキュリティ・マネージャによって拒否された場合
-
findAll
Set<ModuleReference> findAll()このファインダが見つけることができるすべてのモジュール参照のセットを返します。ModuleFinder
は、モジュールが見つかる一貫したビューを提供します。findAll
が複数回呼び出された場合、毎回同じ(equals)結果が返されます。 返されたセットの各ModuleReference
要素に対して、find
がModuleReference
を見つけてそのモジュールを見つけることが保証されます。- APIのノート:
- これは、特定のサービスを提供するモジュールを見つけるためにモジュール・パスをスキャンする必要のある
resolveAndBind
などのメソッドには重要です。 - 戻り値:
- このファインダが見つけたすべてのモジュール参照のセット
- 例外:
FindException
- すべてのモジュールを見つける際にエラーが発生した場合SecurityException
- セキュリティ・マネージャによって拒否された場合
-
ofSystem
static ModuleFinder ofSystem()「システム・モジュール」を見つけるモジュール・ファインダを返します。 システム・モジュールは、Javaランタイム・イメージのモジュールです。 モジュール・ファインダは常にjava.base
を検索します。セキュリティ・マネージャ・セットがある場合、
checkPermission
メソッドが呼び出され、呼び出し元にシステム・モジュールにアクセスするためのRuntimePermission("accessSystemModules")
が付与されているかどうかがチェックされます。- 戻り値:
- システム・モジュールを特定する
ModuleFinder
- 例外:
SecurityException
- セキュリティ・マネージャによって拒否された場合
-
of
static ModuleFinder of(Path... entries) 一連のディレクトリおよび/またはパッケージ化されたモジュールを検索して、ファイル・システム上のモジュールを見つけるモジュール・ファインダを返します。 指定された配列の各要素は、次のいずれかです:モジュールのディレクトリへのパス。
「分解されたモジュール」のtop-levelディレクトリへのパス。
「パッケージ化されたモジュール」へのパス。
要素がモジュールのディレクトリへのパスである場合、ディレクトリ内の各エントリは、パッケージ化されたモジュールまたは展開されたモジュールの最上位ディレクトリです。 ディレクトリに同じ名前のモジュールが複数含まれていると、エラーになります。 要素がディレクトリへのパスであり、そのディレクトリに
module-info.class
という名前のファイルがある場合、そのディレクトリはモジュールのディレクトリではなく、展開されたモジュールとして扱われます。このメソッドによって返されるモジュール・ファインダは、JARファイルとしてパッケージ化されたモジュールをサポートします。
module-info.class
が最上位ディレクトリにあるJARファイル、またはmulti-release JARファイルのバージョニングされたエントリにあるJARファイルは、モジュール式JARファイルであるため、explicitモジュールを定義します。 最上位ディレクトリにmodule-info.class
を持たないJARファイルは、次のように「自動モジュール」を定義します:JARファイルのメイン・マニフェストに"
Automatic-Module-Name
"という属性がある場合、その値は「モジュール名」です。 モジュール名は、JARファイルの名前から派生します。version
と、属性"Automatic-Module-Name
"が存在しない場合のモジュール名は、次のようにJARファイルのファイル名から導出されます:"
.jar
"サフィクスが削除されます。名前が正規表現
"-(\\d+(\\.|$))"
と一致する場合、モジュール名は最初のオカレンスのハイフンの前にあるサブシーケンスから派生します。 ハイフンの後の部分列はVersion
として解析され、Version
として解析できない場合は無視されます。モジュール名の英数字以外の文字(
[^A-Za-z0-9]
)はすべてドット("."
)に置き換えられ、すべての繰り返しドットは1ドットに置き換えられ、先頭と末尾のドットはすべて削除されます。たとえば、"
foo-bar.jar
"という名前のJARファイルは、モジュール名"foo.bar
"を取得し、バージョンは取得しません。 "foo-bar-1.2.3-SNAPSHOT.jar
"という名前のJARファイルは、バージョンとして"foo.bar
"および"1.2.3-SNAPSHOT
"というモジュール名を派生します。
モジュール内のパッケージのセットは、"
.class
"で終わる名前を持つJARファイル内の非ディレクトリ項目から派生します。 候補パッケージ名は、最後のスラッシュまでの文字を使用して名前から導出されます。 残りのスラッシュはすべてドット("."
)に置き換えられます。 結果の文字列が正当なパッケージ名であれば、パッケージ名とみなされます。 たとえば、JARファイルに"p/q/Foo.class
"というエントリが含まれている場合、取得されるパッケージ名は"p.q
"です。META-INF/services/
で始まるエントリの内容は、サービス構成ファイル(ServiceLoader
を参照してください)と見なされます。 ファイル(それはMETA-INF/services/
に続く)の名前が正当なクラス名である場合、それはサービス型の完全修飾クラス名であるとみなされます。 ファイル内のエントリは、プロバイダ・クラスの完全修飾クラス名と見なされます。JARファイルのメイン・マニフェストに
Main-Class
属性がある場合、その値は正当なクラス名であり、そのパッケージはモジュール用に派生したパッケージのセットに含まれており、その値はモジュール「メイン・クラス」です。
ModuleDescriptor
を自動モジュールの(ModuleDescriptor.Builder
APIを使用して)に作成できない場合、FindException
がスローされます。 これは、"Automatic-Module-Name
"属性の値が有効なモジュール名ではなく、JARファイルのファイル名から有効なモジュール名を派生させることができない場合に発生します。JARファイルには、JARファイルの最上位ディレクトリに.class
が含まれますサービス構成ファイルのエントリが正当なクラス名でないか、そのパッケージ名がモジュール用に導出されたパッケージのセットに含まれていない場合。実装は、JARファイルに加えて、他の実装固有のモジュール形式でパッケージ化されたモジュールもサポートします。 このメソッドに指定された配列内の要素がモジュールのディレクトリへのパスである場合、モジュールとして認識されないディレクトリ内のエントリは無視されます。 配列内の要素が、認識されないパッケージ化されたモジュールへのパスである場合、ファイルに遭遇すると
FindException
がスローされます。 存在しないファイルへのパスは常に無視されます。自動モジュールの場合と同様に、パッケージ化されたモジュールまたは分解されたモジュールの内容は、モジュール内のパッケージを判別するためにscannedである必要があります。 「隠しファイル」が無視されるかどうかは、実装固有であるため、指定されません。
.class
ファイル(module-info.class
以外)が最上位ディレクトリにある場合、名前のないパッケージのクラスとみなされるため、FindException
がスローされます。このメソッドで作成されたファインダは怠惰であり、指定されたファイル・パスがディレクトリかパッケージ化されたモジュールであるかどうかを確認する必要はありません。 したがって、
find
またはfindAll
メソッドは、これらのメソッドを呼び出すとディレクトリまたはパッケージ化されたモジュールが検索され、エラーが発生した場合にのみ失敗します。- パラメータ:
entries
- パッケージされたモジュールまたは展開されたモジュールへのモジュールまたはパスのディレクトリへのパスの、おそらく空の配列- 戻り値:
- ファイル・システム上にモジュールを配置する
ModuleFinder
-
compose
static ModuleFinder compose(ModuleFinder... finders) 0個以上のモジュール・ファインダのシーケンスから構成されるモジュール・ファインダを返します。 結果のモジュール・ファインダのfind
メソッドは、モジュールが見つかるか、すべてのモジュール・ファインダが検索されるまで、各モジュール・ファインダのfind
メソッドを配列インデックス順に呼び出すことによってモジュールを探します。 結果のモジュール・ファインダのfindAll
メソッドは、最初のモジュール・ファインダによって配置されたすべてのモジュールを含むモジュールのセットを返します。 一連のモジュールには、2番目以降のモジュール・ファインダによって配置されたすべてのモジュールが含まれます。これらのモジュールは、前のモジュール・ファインダによってシーケンス内に配置されていません。モジュールを見つけると、基礎となるモジュール・ファインダの
find
またはfindAll
メソッドによってスローされた例外またはエラーが、結果として得られるモジュール・ファインダfind
またはfindAll
メソッドの呼び出し側に伝搬されます。- パラメータ:
finders
- モジュール・ファインダの配列- 戻り値:
- 一連のモジュール・ファインダを構成する
ModuleFinder
-