0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Java モジュールシステムに関するまとめ

Last updated at Posted at 2026-01-04

Javaのモジュールシステムについて、学習内容をまとめたものを書いていきます。

モジュールシステム

モジュールシステム(module system)
複数のパッケージを「モジュール」という単位でまとめられる仕組み。

目的

  • パッケージ単位の情報隠蔽を実現する
  • アプリケーションモジュールと JDK モジュールのリンクを容易に構築する

モジュールの作成手順

  1. モジュール用のディレクトリを作成する
  2. そのディレクトリに module-info.java を作成する
  3. 例えば次のようにコンパイルする
$ javac -d mods/moduleA \
  src/moduleA/com/example/module-info.java \
  src/moduleA/com/example/Main.java
  • mods/moduleA:クラスファイルの出力先ディレクトリ
  • src/moduleA/module-info.java:コンパイル対象ファイル①
  • src/moduleA/com/example/Main.java:コンパイル対象ファイル②

module-info.java の記述内容

module-info.java には次の2点を記述します。

  1. どの パッケージ を公開するか(exports
  2. どの モジュール を利用するか(requires
module moduleA {
    exports package1; // 公開するパッケージ
    exports package2;

    requires module1; // 利用するモジュール
    requires module2;
}

モジュールの実行手順

$ java --module-path mods -m moduleA/com.example.Main
  • mods:モジュールが存在するディレクトリ
  • moduleA:モジュール名
  • com.example.Main:実行する完全修飾クラス名

モジュール間の依存関係

モジュールグラフ

モジュールグラフ(module graph)
モジュール間の依存関係を表した図。
モジュールAがモジュールBに依存する場合、A → B の矢印で表現される。

推移的な依存関係

推移的な依存関係(transitive dependencies)
自分が依存しているモジュールを、自分を利用する側にも引き継がせる仕組み。

例えば次の状態では、moduleA は moduleC を直接利用できません

moduleA の module-info.java
module moduleA {
    requires moduleB;
}
moduleB の module-info.java
module moduleB {
    requires moduleC;
}

moduleA から moduleC を利用できるようにするには、moduleB を次のように修正します。

moduleB の module-info.java
module moduleB {
    requires moduleC transitive;
}

相互依存によるコンパイルエラー

相互依存
複数のモジュールが互いに依存している状態。
コンパイラが依存関係を解決できず、コンパイルエラーになる。

モジュールに関するコマンド

モジュールの情報を確認する

方法は2つあります。

  1. java コマンドの --describe-module

    $ java --module-path mods --describe-module moduleA
    
  2. jmod コマンドの describe

    $ jmod create --class-path mods/moduleA moduleA.jmod
    $ jmod describe moduleA.jmod
    

JMODファイル形式
クラスファイルなどを1つのモジュールとしてまとめた形式。
ネイティブコードを含められる点が JAR との大きな違い。

モジュールの依存関係を確認する

  1. java --show-module-resolution

    $ java --module-path mods --show-module-resolution -m moduleA/com.example.a.Main
    
  2. jdeps コマンド

    $ jdeps mods/moduleA
    

非公開パッケージを一時的に利用する

  1. javac --add-exports オプション
    exports されていないパッケージを一時的に利用してコンパイルする。

    • 記法: --add-exports (対象モジュール)/(公開パッケージ)=(利用モジュール)
    • あくまで緊急避難用。乱用は非推奨。
    $ javac -d mods/moduleA \
      --module-path mods \
      --add-exports moduleB/com.example.b=moduleA \
      src/moduleA/module-info.java \
      src/moduleA/com/example/a/Main.java
    

java.base モジュール

java.base モジュール
java.langjava.utiljava.io など、ほぼすべてのプログラムで使用される基本モジュール。
明示的に requires しなくても自動的に読み込まれる。

明示しない場合、モジュール情報の出力には次のように表示される。

module moduleA {
    // ...
    requires java.base mandated;
    // ...
}

参考文献

  1. 志賀澄人. 徹底攻略 Java SE 11 Silver問題集 : [1Z0-815]対応. 東京, インプレス, 2019, p.371–392, 397, 412, 452, 453, 468, ISBN4-295-00762-5.

  2. Deitel, Paul. “Java 9 Modulesの理解”. Oracle. https://www.oracle.com/jp/corporate/features/understanding-java-9-modules.html, (参照 2023-11-24).

  3. tyab. “Java JMODファイルとは, JARファイルとの違い. ”. tyablog.net. 2020-04-05. https://tyablog.net/2020/04/05/java-how-different-jmod-and-jar/, (参照 2023-11-24).

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?