構成は、解像度の出力である「可読性グラフ」をカプセル化します。 可読性グラフは頂点がResolvedModule
型の有向グラフであり、エッジはモジュール間の可読性を表す。 Configuration
は、modules()
メソッドを定義して、グラフ内に解決されたモジュールのセットを取得します。 ResolvedModule
は、解決されたモジュールが読み取るモジュールのセットを取得するreads()
メソッドを定義します。 読み取られるモジュールは、同じ構成でも、parent
構成でも構いません。
構成では、ルート・モジュールのコレクションを解決するためのresolve
メソッドと、サービス・バインディングを使用した解決を行うresolveAndBind
メソッドが定義されています。 両方のメソッドのインスタンスと静的バリアントがあります。 インスタンス・メソッドは、親コンフィギュレーションとしてレシーバを使用した構成を作成します。 静的メソッドは、複数の親構成が存在する可能性のある、より高度な場合です。
Java仮想マシン内のモジュールの各layer
は、構成から作成されます。 boot
層の構成は、 ModuleLayer.boot().configuration()
を呼び出すことによって得られます。 新しい構成を作成するときは、ブート・レイヤーの構成が親となることがよくあります。
例
次の例では、resolve
メソッドを使用して、ブート・レイヤーの構成を親構成としてmyappという名前のモジュールを解決します。 解決された各モジュールの名前と、各モジュールが読み取るモジュールの名前を出力します。
ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
Configuration parent = ModuleLayer.boot().configuration();
Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("myapp"));
cf.modules().forEach(m -> {
System.out.format("%s -> %s%n",
m.name(),
m.reads().stream()
.map(ResolvedModule::name)
.collect(Collectors.joining(", ")));
});
- 導入されたバージョン:
- 9
- 関連項目:
-
メソッドのサマリー
修飾子と型メソッド説明static Configuration
empty()
empty構成を返します。findModule
(String name) この構成で解決されたモジュールを検索するか、この構成でない場合はparent構成を検索します。modules()
この構成内の解決済モジュールの変更不可能なセットを返します。parents()
この構成の親の変更不可能なリストを検索順序で返します。resolve
(ModuleFinder before, ModuleFinder after, Collection<String> roots) 新しい構成を作成するために、この構成を親として、ルート・モジュールのコレクションを解決します。static Configuration
resolve
(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots) ルート・モジュールの集合を解決して構成を作成します。resolveAndBind
(ModuleFinder before, ModuleFinder after, Collection<String> roots) サービス・バインディングを持つルート・モジュールの集合を親として解決し、新しい構成を作成します。static Configuration
resolveAndBind
(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots) サービス・バインディングを使用してルート・モジュールの集合を解決し、構成を作成します。toString()
この構成を記述する文字列を返します。
-
メソッドの詳細
-
resolve
public Configuration resolve(ModuleFinder before, ModuleFinder after, Collection<String> roots) 新しい構成を作成するために、この構成を親として、ルート・モジュールのコレクションを解決します。 このメソッドは、親としてこの構成で呼び出されたときに静的なresolve
メソッドで指定されたとおりに動作します。 つまり、この構成がcf
の場合、このメソッドは次の呼び出しと同じです:Configuration.resolve(before, List.of(cf), after, roots);
- パラメータ:
before
- モジュールを見つける前のモジュール・ファインダafter
-before
モジュール・ファインダまたは親構成で見つからない場合にモジュールを見つけるためのモジュール後のファインダroots
- 解決するモジュールのおそらく空のモジュール名の集合- 戻り値:
- 指定されたルート・モジュールを解決した結果の構成
- 例外:
FindException
- 静的なresolve
メソッドで指定された可観測性に関連する理由のいずれかで解決が失敗した場合ResolutionException
- 解決がstaticresolve
メソッドで指定された整合性チェックに失敗した場合SecurityException
- セキュリティ・マネージャによってモジュールの位置が拒否された場合
-
resolveAndBind
public Configuration resolveAndBind(ModuleFinder before, ModuleFinder after, Collection<String> roots) サービス・バインディングを持つルート・モジュールの集合を親として解決し、新しい構成を作成します。 このメソッドは、親としてこの構成で呼び出されたときに静的なresolveAndBind
メソッドで指定されたとおりに動作します。 つまり、この構成がcf
の場合、このメソッドは次の呼び出しと同じです:Configuration.resolveAndBind(before, List.of(cf), after, roots);
- パラメータ:
before
- モジュールを見つける前のモジュール・ファインダafter
-before
モジュール・ファインダまたは親構成で見つからない場合にモジュールを見つけるためのモジュール後のファインダroots
- 解決するモジュールのおそらく空のモジュール名の集合- 戻り値:
- 指定されたルート・モジュールをサービス・バインディングで解決した結果の構成
- 例外:
FindException
- 静的なresolve
メソッドで指定された可観測性に関連する理由のいずれかで解決が失敗した場合ResolutionException
- 解決がstaticresolve
メソッドで指定された整合性チェックに失敗した場合SecurityException
- セキュリティ・マネージャによってモジュールの位置が拒否された場合
-
resolve
public static Configuration resolve(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots) ルート・モジュールの集合を解決して構成を作成します。各ルート・モジュールは、指定された
before
モジュール・ファインダを使用して配置されます。 モジュールが見つからない場合、それは、反復順序で各親に対してfindModule
メソッドを呼び出すかのように、親構成に配置されます。 見つからなければ、モジュールは指定されたafter
モジュール・ファインダを使用して配置されます。 推移依存を見つけるために同じ検索順序が使用されます。 親構成にあるルート・モジュールまたは依存関係は、これ以上解決されず、結果の構成には含まれません。すべてのモジュールが列挙されると、可読性グラフが計算され、モジュールのエクスポートおよびサービスの使用とともに、整合性がチェックされます。
次のobservability-relatedの理由で、
FindException
で解決できないことがあります:ルート・モジュール、または直接的または推移的な依存関係が見つかりません。
モジュールを見つけるときにエラーが発生します。 考えられるエラーには、I/Oエラー、モジュール記述子(
module-info.class
)の解析で検出されたエラー、または同じモジュールの2つのバージョンが同じディレクトリに見つかりました。
次の整合性チェックのいずれかが失敗した場合、
ResolutionException
で解決が失敗することがあります:モジュール
m1
がモジュールm2
を必要とし、m2
がm1
を必要とするところで、サイクルが検出されます。モジュールは、同じ名前の2つ以上のモジュールを読み取ります。 これはモジュールがそれ自身と同じ名前の別のものを読み込む場合も含みます。
コンフィギュレーション内の2つ以上のモジュールが、同じパッケージを両方を読み込むモジュールにエクスポートします。 これには、パッケージ
p
を含むモジュールM
が、p
をM
にエクスポートする別のモジュールを読み込む場合も含まれます。モジュール
M
は、M
が"uses p.S
"または"provides p.S with ...
"を宣言しますが、パッケージp
はモジュールM
にもM
にもM
が読み取るモジュールによってM
にエクスポートされません。
- 実装上のノート:
- 実装では、モジュールの可観測性は、特定のオペレーティング・システムまたはアーキテクチャの密接に結合されたモジュールまたはモジュールの異なるビルドが同じ構成で結合されないようにする参照整合性またはその他のチェックに依存する場合があります。
- パラメータ:
before
- モジュールを見つける前のモジュール・ファインダparents
- 検索順序のリストの親構成after
-before
モジュール・ファインダまたは親構成で見つからない場合にモジュールを見つけるためのモジュール後のファインダroots
- 解決するモジュールのおそらく空のモジュール名の集合- 戻り値:
- 指定されたルート・モジュールを解決した結果の構成
- 例外:
FindException
- 上記で特定された観察可能性の理由のいずれかで解決が失敗した場合ResolutionException
- 上記で指定された一貫性チェックのいずれかが失敗した場合IllegalArgumentException
- 親のリストが空であるか、リストに異なるターゲット・オペレーティング・システム、アーキテクチャ、またはバージョン用のモジュールを持つ2つ以上の親がある場合SecurityException
- セキュリティ・マネージャによってモジュールの位置が拒否された場合
-
resolveAndBind
public static Configuration resolveAndBind(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots) サービス・バインディングを使用してルート・モジュールの集合を解決し、構成を作成します。このメソッドは、解決されたモジュールのグラフがサービス使用依存関係によって誘導されたモジュールで拡張される点を除いて、
resolve
で指定されたとおりに動作します。具体的には、ルート・モジュールは、
resolve
を呼び出すように解決されます。 解決されたモジュール、および親構成内のすべてのモジュールが、service dependences
で検査されます。 与えられたモジュールが見つけたすべてのモジュールは、provide
が1つ以上のサービス・タイプの実装をモジュール・グラフに追加し、resolve
メソッドを呼び出しているかのように解決します。 モジュール・グラフにモジュールを追加すると、新しいサービス使用依存が導入される可能性があるため、モジュールが追加されなくなるまで、プロセスは繰り返し実行されます。サービス・バインディングは解決を伴うので、
resolve
で指定されたのと全く同じ理由で、FindException
またはResolutionException
で失敗する可能性があります。- パラメータ:
before
- モジュールを見つける前のモジュール・ファインダparents
- 検索順序のリストの親構成after
-before
モジュール・ファインダまたは親構成で見つからない場合にモジュールを見つけるためのモジュール後のファインダroots
- 解決するモジュールのおそらく空のモジュール名の集合- 戻り値:
- 指定されたルート・モジュールをサービス・バインディングで解決した結果の構成
- 例外:
FindException
- 静的なresolve
メソッドで指定された可観測性に関連する理由のいずれかで解決が失敗した場合ResolutionException
- 解決がstaticresolve
メソッドで指定された整合性チェックに失敗した場合IllegalArgumentException
- 親のリストが空であるか、リストに異なるターゲット・オペレーティング・システム、アーキテクチャ、またはバージョン用のモジュールを持つ2つ以上の親がある場合SecurityException
- セキュリティ・マネージャによってモジュールの位置が拒否された場合
-
empty
public static Configuration empty()empty構成を返します。 空の構成のモジュールはありません。 両親はいません。- 戻り値:
- 空の構成
-
parents
public List<Configuration> parents()この構成の親の変更不可能なリストを検索順序で返します。 これが「空の構成」の場合、空のリストが返されます。- 戻り値:
- この親の構成の、おそらく空の変更不可能なリスト
-
modules
public Set<ResolvedModule> modules()この構成内の解決済モジュールの変更不可能なセットを返します。- 戻り値:
- この構成で解決されたモジュールの、おそらく空の変更不可能なセット
-
findModule
public Optional<ResolvedModule> findModule(String name) この構成で解決されたモジュールを検索するか、この構成でない場合はparent構成を検索します。 親構成でモジュールを見つけることは、モジュールが見つかるまで、またはすべての親が検索されるまで、各親で、検索順にfindModule
を呼び出すのと同じです。 「構成ツリー」では、これは深さ優先探索と同じです。- パラメータ:
name
- 見つけられる解決されたモジュールのモジュール名- 戻り値:
- 指定された名前を持つ解決されたモジュール、またはこの構成またはこの親構造にこの名前のモジュールがない場合は空の
Optional
-
toString
public String toString()この構成を記述する文字列を返します。
-