【Java学習|初心者向け】Java 9以降の必須知識!Project Jigsaw(Javaモジュールシステム)を基礎から解説

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

Java 9で導入された「Project Jigsaw(Javaモジュールシステム)」は、Javaの歴史の中でも非常に大きな転換点でした。これまで、Javaのプログラムは「クラス」の集合体でしたが、それをより大きな単位である「モジュール」として管理できるようになりました。なぜこれが重要かというと、大規模なアプリケーションにおいて「どのクラスが必要で、どのクラスが不要か」を明確にし、メモリ消費を抑え、依存関係を整理してセキュリティとパフォーマンスを向上させるためです。

2. 基礎知識:モジュールとは何か?

これまでのJavaは、すべてのクラスがどこからでもアクセス可能な状態(publicであれば誰でも見える)になりがちでした。モジュールシステムでは、以下の概念が重要になります。

module-info.java: モジュールの「設計図」です。ここで「このモジュールは何を公開し、何に依存しているか」を定義します。
exports: 公開設定です。指定したパッケージのみを外部から利用可能にします。
opens: リフレクション(実行時にクラスを動的に操作する技術)を許可するための設定です。

3. 実装/解決策:モジュールを作ってみよう

モジュール化の第一歩は、プロジェクトのルートディレクトリに「module-info.java」を作成することです。

手順は以下の通りです。
1. プロジェクトのソースフォルダ直下に「module-info.java」を作成する。
2. module キーワードを使ってモジュール名を宣言する。
3. requires で必要な外部モジュールを指定する。
4. exports で外部に公開したいパッケージを指定する。

4. サンプルプログラム

以下は、基本的なモジュール定義の例です。これをコピーして、プロジェクトのsrcフォルダ直下に配置してください。

// module-info.java
// モジュール名を定義します。慣習としてパッケージ名のように命名します。
module com.example.myapp {

// このモジュールが依存する他のモジュールを指定します。
// 例:Javaの標準的な機能を使う場合
requires java.base;
requires java.sql;

// 外部から利用させたいパッケージを公開します。
// ここで指定しないパッケージは、外部からアクセスできません。
exports com.example.myapp.service;

// リフレクションを許可したい場合(フレームワーク利用時など)
// opens com.example.myapp.model to com.fasterxml.jackson.databind;
}

5. 応用・注意点:現場で陥りやすい罠

現場でJigsawを使う際、特に注意すべきは「意図しない非公開クラスへのアクセス」です。

注意点1:カプセル化の強化
以前のJavaでは、publicであれば他パッケージから自由に使えましたが、モジュール化すると exports していないパッケージには一切アクセスできなくなります。「なぜかクラスが見つからない」というエラーが出たら、module-info.javaのexports設定をまず疑ってください。

注意点2:リフレクションとopens
Spring Frameworkなどのフレームワークを使用する場合、プログラムが実行時に裏側でクラスを覗き見ることがあります。この時、単にクラスを公開するだけでは足りず、opens を使ってリフレクションを許可する必要があります。

モジュール化は最初は少し複雑に感じるかもしれませんが、大規模なシステム開発においては「依存関係の見える化」という強力な武器になります。まずは小さなプロジェクトから、module-info.javaを書く練習を始めてみてください。

コメント

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