【Java学習|初心者向け】Java 9以降の必須知識!モジュールシステムにおける「requires」の役割と使い方

1. 導入:なぜモジュールシステムが必要なのか

Java 9から導入された「Javaモジュールシステム(Project Jigsaw)」は、大規模なアプリケーションをより安全に、そして軽量に構築するための仕組みです。従来のJavaでは、クラスパスにJARファイルさえあれば、どのクラスにもアクセスできてしまうという「カプセル化の欠如」が課題でした。これに対し、モジュールシステムは「どのパッケージを公開し、どのモジュールに依存するか」を厳密に制御します。その制御の鍵となるのが「requires」です。

2. 基礎知識:モジュールとmodule-info

モジュールシステムでは、各モジュールのルートディレクトリに「module-info.java」という設定ファイルを配置します。このファイルがモジュールの設計図となり、以下のキーワードを使って制御します。

・module-info.java: モジュールの定義ファイル。
・requires: 他のモジュールを利用するために必要であることを宣言します。
・exports: 自分のモジュール内の特定のパッケージを、外部から利用できるように公開します。
・opens: リフレクション(実行時の動的なクラス操作)を許可する場合に使用します。

つまり、あるモジュールが別のモジュールを利用したい場合、相手側が「exports」で公開し、自分側が「requires」で宣言するという「合意」が必要になります。

3. 実装:requiresの使い方

「requires」を使用する際は、依存先となるモジュール名を指定します。これにより、コンパイル時および実行時に、必要なモジュールが揃っているかをJava仮想マシン(JVM)が厳格にチェックします。万が一、必要なモジュールが足りなければ、Javaは起動時にエラーを出して停止するため、実行中の「NoClassDefFoundError」などの予期せぬトラブルを未然に防ぐことができます。

4. サンプルプログラム

以下は、あるモジュールが「java.sql」モジュールを利用する場合の記述例です。

// module-info.java
module com.example.myapp {
// java.sqlモジュール(データベース操作用)を利用することを宣言
requires java.sql;

// 他のモジュールに公開するパッケージを指定
exports com.example.myapp.service;
}

// Main.java (利用側のコード)
package com.example.myapp;

import java.sql.Connection;
import java.sql.DriverManager;

public class Main {
public static void main(String[] args) {
// requiresで宣言しているため、java.sqlのクラスを安全に利用できる
System.out.println(“モジュールシステム経由でSQLモジュールを読み込みました。”);
}
}

5. 応用・注意点:現場で役立つポイント

・推移的依存関係(transitive):
もし自分のモジュールを利用する他のモジュールに対しても、依存先のモジュールを公開したい場合は「requires transitive モジュール名;」を使います。これを忘れると、ライブラリの利用者がコンパイルエラーになることがあるため注意してください。

・静的依存とオプション:
特定の環境でのみ必要なライブラリがある場合は「requires static モジュール名;」を使うことで、コンパイル時には必要だが実行時には必須ではない(オプション)という設定も可能です。

・移行のコツ:
既存の古いプロジェクトをモジュール化する際は、すべてを一度に切り替えるのではなく、まずは「名前付きモジュール」として少しずつ移行し、依存関係を整理することをお勧めします。いきなり厳格な制限をかけると開発効率が落ちるため、段階的な導入が現場での定石です。

コメント

タイトルとURLをコピーしました