MENU

【Java】モジュールシステムめも【Java Silver】

こんにちは。くまごろーです。
勉強を進めてきて、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