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ファイルとしてパッケージ化されたモジュールをサポートします。 最上位ディレクトリまたはmulti-release JARファイル内のバージョン管理されたエントリに
module-info.class
を含む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
-