パッケージ java.lang.module
特に指定がないかぎり、このパッケージ内のクラスまたはインタフェースのメソッドやコンストラクタにnull引数を渡すと、NullPointerExceptionがスローされます。 また、null要素を含む配列またはコレクションを持つメソッドを呼び出すと、特に指定されていないかぎり、NullPointerExceptionが発生します。
モジュールの解決
解決とは、モジュールが相互にどのように依存するかを計算するプロセスです。 プロセスはコンパイル時と実行時に行われます。
解決は2段階のプロセスです。 最初のステップでは、一連のルート・モジュールのrequiresディレクティブを再帰的に列挙します。 すべての列挙モジュールが監視可能な場合は、2番目のステップでそれらの可読性グラフが計算されます。 可読性グラフは、モジュールが相互にどのように依存しているかを示し、モジュール境界間のアクセスを制御します。
ステップ1: 再帰的列挙
再帰的列挙では、一連のモジュール名を取得し、各モジュール宣言を検索し、各モジュール宣言について再帰的に列挙します。
-
'transitive'修飾子を持つ'requires'ディレクティブで指定されたモジュール名
-
ホストシステムの判断で、「transitive」修飾子なしで「requires」指令によって指定されたモジュール名。
モジュール宣言は、一連の監視可能モジュール内で検索されます。 監視可能なモジュールのセットは、実装固有の方法で決定されます。 監視可能モジュールのセットには、明示的な宣言を持つモジュール(つまり、module-info.javaソース・ファイルまたはmodule-info.classファイル)と、暗黙的な宣言を持つモジュール(つまり、自動モジュール)を含めることができます。 自動モジュールには明示的なモジュール宣言がないため、それ自身のrequiresディレクティブはありませんが、その名前は明示的なモジュール宣言のrequiresディレクティブで指定できます。
このアルゴリズムへの初期入力の名前を持つルート・モジュールのセットは、実装固有の方法で決定されます。 ルート・モジュールのセットには、自動モジュールが含まれる場合があります。
このアルゴリズムによって少なくとも1つの自動モジュールが列挙される場合、明示的なモジュール宣言の'requires'ディレクティブによって名前が指定されているかどうかに関係なく、すべての監視可能な自動モジュールを列挙する必要があります。
次のいずれかの状況が発生した場合、解決は失敗します。
どのルートモジュールも観察できません。
'transitive'修飾子を持つ'requires'ディレクティブによって名前が指定されているモジュールは、監視できません。
ホストシステムの判断では、「transitive」修飾子のない「requires」指令によって名前が指定されているモジュールは、監視できません。
このステップのアルゴリズムは、同じモジュール名を2回列挙します。 これは、任意の推移的修飾子を無視して、requiresディレクティブ内のサイクルを示します。
それ以外の場合、解決はステップ2に進みます。
ステップ2: 可読性グラフの計算
'requires'ディレクティブ('transitive'に関係なく)は、あるモジュールが他のモジュールに依存していることを表します。 'transitive'修飾子の効果は、追加のモジュールが他のモジュールにも依存するようにすることです。 モジュールMが'transitive N'を必要とする場合、MはNに依存するだけでなく、Mに依存するモジュールもNに依存します。 これにより、Mがリファクタリングされ、'requires M'ディレクティブを持つモジュールを壊さずに、その内容の一部またはすべてを新しいモジュールNに移動できます。
モジュールの依存関係は、可読性グラフで表されます。 可読性グラフは、頂点がステップ1で列挙されたモジュールであり、そのエッジがモジュールのペア間の可読性を表す有向グラフです。 エッジは次のように指定します。
まず、可読性は列挙されたモジュールのrequiresディレクティブによって決定され、transitive修飾子は無視されます。
Bを必要とする列挙モジュールAごとに、読取りBです。
自動化された各列挙モジュールXについて: Xは、他のすべての列挙モジュールを「読み込み」します(自動モジュールには、他のすべての列挙モジュールに対して「requires」ディレクティブがあるかのように)。
次に、可読性が「推移的」修飾子に対応するように拡張されます。
-
Bを読み取る列挙モジュールAごとに、次のようにします。
Bが推移的Cを必要とする場合、AはCとBを読み取ります。 この拡張は再帰的です。AがCを読み取るため、Cが推移的Dを必要とする場合、AがD、CおよびBを読み取ります。
Bが自動モジュールの場合、Aは列挙された他のすべての自動モジュールを読み取ります。 (これは、自動モジュールが、他のすべての列挙自動モジュールに対して「推移的」指令を持つようになります)。
最後に、すべてのモジュールがそれ自体を読み取ります。
次のいずれかの条件が可読性グラフで発生した場合、解決は失敗します。
モジュールは、同じ名前の複数のモジュールを読み取ります。 これには、モジュールが自身と同じ名前の別のモジュールを「読み取る」場合も含まれます。
2つ以上のモジュールが、同じ名前のパッケージを、両方を読み取るモジュールにエクスポートします。 これには、パッケージpを含むモジュールMが、pをMにエクスポートする別のモジュールを「読み込む」場合も含まれます。
モジュールMは'uses p.S'または'provides p.S with ...'を宣言しますが、パッケージpはモジュールMでもなく、Mが"read"しているモジュールによってMにエクスポートされることもありません。
それ以外の場合、解決は成功し、解決の結果は可読性グラフになります。
ルートモジュール
コンパイル時のルート・モジュールのセットは、通常、コンパイルされるモジュールのセットです。 実行時、ルート・モジュールのセットは、通常、'java'ランチャに指定されたアプリケーション・モジュールです。 名前のないモジュールでコードをコンパイルする場合、またはメイン・アプリケーション・クラスがクラス・パスからロードされる場合、実行時にルート・モジュールのデフォルト・セットは実装固有です。 JDKでは、ルート・モジュールのデフォルト・セットには、アップグレード・モジュール・パスまたはシステム・モジュール間で監視可能なすべてのモジュールが含まれ、資格なしで少なくとも1つのパッケージがエクスポートされます。
可観測モジュール
コンパイル時と実行時の両方で観測可能モジュールのセットは、複数の異なるパスを検索したり、環境に組み込まれたコンパイル済モジュールを検索したりすることによって決定されます。 検索順序は、次のとおりです。
コンパイル時のみ、コンパイル・モジュール・パス。 このパスには、ソース形式のモジュール定義が含まれます。
アップグレード・モジュールのパス。 このパスには、(3)および(4)に存在するアップグレード可能モジュールのコンパイル済み定義よりも優先して観察されるモジュールのコンパイル済み定義が含まれています。 アップグレード可能な標準モジュールの指定については、Java SEプラットフォームを参照してください。
システム・モジュールは、環境に組み込まれたコンパイル済定義です。
アプリケーション・モジュール・パス。 このパスには、ライブラリおよびアプリケーション・モジュールのコンパイル済定義が含まれます。
'static'修飾子を持つ'requires'ディレクティブ
'static'修飾子を持つ'requires'ディレクティブは、実行時にオプションの依存性を表します。 モジュールがstatic Mが必要であると宣言した場合、resolutionは依存性を満たすためにMの観測可能モジュールを検索しません。 ただし、ステップ1でMが再帰的に列挙される場合、列挙されるすべてのモジュールと'requires static M'はMを読み取ります。
完全性
一連のモジュールをコンパイルするために完全な推移的クロージャーを必要としないという点で、解決はコンパイル時に部分的である可能性があります。 最低限、コンパイル時に構築および検証される可読性グラフには、コンパイルされるモジュール、その直接的な依存関係、および暗黙的に宣言された依存関係がすべて含まれます(推移的である必要があります)。
実行時、解決は追加プロセスです。 ステップ1での再帰的列挙は、以前の解像度を基準にして、ルート・モジュールまたは'requires'ディレクティブで指定されたモジュールが、以前の(または親の)解像度で列挙されたときに列挙されないようにすることができます。 したがって、解像度の結果である可読性グラフには、ステップ1で列挙されたモジュールの頂点がある場合がありますが、エッジは、モジュールが前の(または親の)解像度で列挙されたモジュールを読み取ることを表します。
- 導入されたバージョン:
- 9
-
インタフェースのサマリー インタフェース 説明 ModuleFinder モジュールのファインダ。ModuleReader モジュールのコンテンツへのアクセスを提供します。 -
クラスのサマリー クラス 説明 Configuration サービス・バインディングを使用した解決または解決の結果となる構成。ModuleDescriptor モジュール記述子。ModuleDescriptor.Builder ModuleDescriptorオブジェクトをビルドするためのビルダー。ModuleDescriptor.Exports モジュールによってエクスポートされたパッケージは、修飾されたり、修飾されていない場合があります。ModuleDescriptor.Opens モジュールによって開かれたパッケージは、修飾されたり、修飾されていない場合があります。ModuleDescriptor.Provides モジュールが1つ以上の実装を提供するサービス。ModuleDescriptor.Requires モジュールへの依存ModuleDescriptor.Version モジュールのバージョン文字列。ModuleReference モジュールのコンテンツへの参照。ResolvedModule 解決済モジュールのグラフ内のモジュール。 -
列挙型のサマリー 列挙型 説明 ModuleDescriptor.Exports.Modifier エクスポートされたパッケージの修飾子。ModuleDescriptor.Modifier モジュール上の修飾子。ModuleDescriptor.Opens.Modifier オープン・パッケージの修飾子。ModuleDescriptor.Requires.Modifier モジュール依存性の修飾子。 -
例外のサマリー 例外 説明 FindException モジュールの検索中にエラーが発生すると、ModuleFinderによってスローされます。InvalidModuleDescriptorException モジュール記述子の読取り時にスローされ、モジュール記述子が不正な形式であることが判明したか、またはモジュール記述子として解釈できません。ResolutionException モジュールのセットの解決時、またはサービス・バインディングを使用したモジュールのセットの解決時にスローされます。