1. モジュール定義
Java SE 11 Goldにおいて、モジュールシステム(Project Jigsaw)はもっとも配点が高く、かつ実務で馴染みが薄いため「最大の壁」になりやすい分野です。
試験対策として押さえるべきポイントを**「定義の書き方」「コマンド」「ルール」**の3点に絞って解説します。
1. モジュール定義 (module-info.java) の構文¶
モジュールのルートディレクトリに配置する module-info.java の記述ルールが頻出です。以下の5つのキーワードを区別できるようにしましょう。
requires: 依存するモジュールを指定(**モジュール名**を指定)。exports: 外部に公開するパッケージを指定(**パッケージ名**を指定)。requires transitive: 「依存の再エクスポート」。AがBをtransitiveでrequiresしている場合、Aを利用するCは、自動的にBにもアクセスできるようになります。opens: リフレクション(実行時の型操作)によるアクセスのみを許可する。provides ... with ...: サービス・インターフェースの実装を提供する場合に使用。
2. 覚えておくべき3つの重要ルール¶
試験では「コードを見て、コンパイルエラーになるか実行時例外になるか」を問われます。
- 読み取り可能性(Readability): 自分が
requiresしていないモジュールのクラスは使えません。 - アクセスコントロール:
publicクラスであっても、そのパッケージがexportsされていない限り、他のモジュールからは見えません。 - 推移的依存(Transitive Dependency):
requires A;だけでは、Aが依存しているBにはアクセスできません。- Aが
requires transitive B;と書いていれば、自分もBにアクセスできます。
3. コマンドライン・オプション¶
SE 11 Goldでは、コマンドの問題も出題されます。特に以下のパスの違いに注意してください。
* **`--module-path` (または `-p`)**:
コンパイル済みモジュール(.jmod や .jar)が置いてある場所を指定します。従来の classpath に代わるものです。
* --module (または -m):
実行するメインモジュールとクラスを指定します(例: java --module-path mods -m my.module/com.example.Main)。
* jdeps:
クラスやJARファイルがどのモジュールに依存しているかを解析するツールです。
4. 特殊なモジュール¶
* **java.base**: すべてのモジュールが自動的に `requires` している基本モジュール(`java.lang` などを含む)。
* **名前なしモジュール (Unnamed Module)**:
クラスパス上に配置されたJARやクラスが属する場所。すべてのモジュールにアクセスでき、すべてのモジュールから(従来のクラスパス方式として)アクセス可能です。
* **自動モジュール (Automatic Module)**:
モジュール化されていない既存のJARファイルを --module-path に置くと、ファイル名に基づいた名前のモジュールとして扱われます。
よく出る「ひっかけ」パターン¶
「AモジュールがBパッケージを
exportsしているが、利用側のCモジュールがrequiresを書き忘れている」というパターンが非常に多いです。**「出す(exports)側」と「入れる(requires)側」の両方が揃っているか**を必ず確認してください。
次は、具体的に「requires transitive」などの挙動をコード例で詳しく見てみますか?それとも、別の頻出分野(並列処理など)に進みますか?