こんにちは。くまごろーです。
勉強を進めてきて、Java Silverのモジュールシステムのことがよくわからないのでここでまとめます。
完全に自分用メモです。
1 モジュールシステムとは?
Java SE 9で追加されたもの。モジュールシステムを使えば、複数のパッケージを1つにまとめ、公開するパッケージと非公開にするパッケージを分けて管理することができる。複数のパッケージをまとめて管理する単位のことを「モジュール」と呼ぶ。パッケージ単位の情報隠蔽を実現するのがモジュールシステムの目的である。
2 モジュールの作成
モジュール用のディレクトリを作成し、そのディレクトリにmodule-info.javaというファイルを作り、その他のソースファイルと共にコンパイルする。
module-info.javaには、以下の2点を記述する。
・どのパッケージを公開するのか
・ほかのどのモジュールを使うのか
<例>(com.testパッケージを公開し、fooモジュールを利用する)
module test { exports com.test; //exports パッケージ名 requires foo; //requires モジュール名 }
3 モジュール化(コンパイル)
モジュール化するには、module-info.javaとソースファイルをコンパイルする。コンパイル時には、javacコマンドの-dオプションを使う
<構文>
javac -d クラスファイルの出力先ディレクトリ コンパイルするファイルのパス
<例>
javac -d mods/test src/test/module-info.java src/test/com/sample/Main.java
3 モジュールの実行
モジュールの実行には、javaコマンドの--module-pathオプションでモジュールを探すためのモジュールパスを指定し、-mオプションで実行したいモジュールのクラスを指定する。
<構文>
java --module-path モジュールのルートディレクトリ -m 実行したいモジュールのクラス
<例>
java --module-path mods -m test/com.sample.Main
//testモジュールのcom.sample.Mainクラスを実行
※ モジュールはjarコマンドで1つにまとめることができる。
<構文>
jar --create --file=jarファイル名 --main-class=エントリーポイントを持つクラス -C jarファイルに含めるファイルがあるディレクトリ
<例>
jar --create --file=mlib/test.jar --main-class=com.sample.Main -C mods/test
4 モジュールの情報を確認するには
そのモジュールがどのようなパッケージを公開しているのか等の情報を確認するには、以下の様なコマンドがある。
(1)javaコマンドの--describe-moduleオプション
モジュールの説明を表示するためのコマンド。このオプションを使うとモジュールの実行は行われず、説明を表示してコマンドが終了する。
<例>
>java --module-path mods --describe-module test
test file://Users/kuma/top/java/mods/test/
exports com.sample
requires java.base mandated
(2)jmodコマンドのdescribeモード
JMODファイル形式のモジュールファイルを扱うためのコマンド。JMODファイルにクラスファイルなどをまとめ、1つのモジュールとして提供することができる。
<例>
>java create --classpath mods /test test.jmod >jmod describe test.jmod exports com.sample requires java.base mandated
5 依存関係を調べるには
クラス・モジュール等の依存関係を調べるには、以下のコマンドを使用する。
(1)クラス・メソッド・Jarファイル・モジュールの依存関係
jdepsコマンドを使用する。
<例>
>jdeps --list-deps hello.jar java.base
(2)プログラム実行時の依存モジュール
javaコマンドの--show-module-resolutionオプションを使用することで、プログラム実行時に依存するモジュールがどのように探されているか表示することができる。
<例>
>java --module-path mods --show-module-resolution -m test/com.sample.Main root test file://... test requires foo file://... java.base binds java.management 以下省略
6 非公開パッケージを一時的に公開するには
javacコマンドの--add-exportsオプションでコンパイルすることで、非公開のパッケージを一時的に公開することができる。
<例>
> javac -d mods/test --module-path mods/ \ > --add-exports test/com.hello=test \ //対象のモジュール/公開するパッケージ=利用するモジュール > src/test/module-info.java src/test/com/sample/Main.java