Java Silverの勉強を進めていく中でよくわからなかったモジュールシステムについてまとめたいと思います。
モジュールシステムとは?
モジュールシステムを使えば、複数のパッケージを1つにまとめ、公開するパッケージと非公開にするパッケージを分けて管理することができる。この複数のパッケージをまとめて管理する単位のことを「モジュール」と呼ぶ。
モジュール内のパッケージは、明治的に公開しなければ非公開パッケージとなり、そのパッケージに含まれるクラスがたとえpublicであっても、外部のモジュールからはアクセスすることができない。
このようにして、パッケージ単位の情報隠蔽を実現するのがモジュールシステムの目的である。
モジュールの基本
モジュールを作成するには、モジュール用のディレクトリを作成し、そのディレクトリにmodule-info-javaというファイルを作り、その他のソースファイルと共にコンパイルする。
module-info.javaには、以下の2点を記述する。
・どのパッケージを公開するのか (exports宣言)
・ほかのどのモジュールを使うのか (requires宣言)
module test{
//testモジュールからcom.example.testパッケージを公開する。
exports com.test;
//fooモジュールを利用する。
requires foo;
}
推移的な依存関係
推移的な依存関係とは、「自分が」必要とするモジュールを、「自分を」必要とするモジュールにも利用させるという意味です。
//module1のmodule-info.java
module module1 {
requires module2
}
//module2のmodule-info.java
module module2{
requires transitive module3
module2が必要とするモジュールの設定をmodule1に伝搬するためには、上記のようにtransiveを付けてrequiresを記述する。
module2が利用するmodule3をtransitive(推移的)で修飾すると、module2を利用するmodule1はmodule3も同時に利用できる。
プラットフォームモジュール
プラットフォームモジュールとは、標準クラスライブラリなど、あらかじめ用意されているライブラリがモジュールシステムの登場によってモジュールとしてとして提供されたもの。java.baseモジュールはjava.langパッケージやjava.util,java.ioなどのプログラミングする上でどのようなプログラムであっても使うであろうパッケージをまとめたもの。
java.baseモジュールは、明示的にrequiresで宣言をしなくても自動的に読み込まれる。
コマンドに関して
Java SE11 Silver問題集に出てきたモジュールシステムに関してのコマンドをまとめます。
モジュール化(コンパイル)
モジュール化するには、module-info.javaとソースファイルをコンパイルする。コンパイル時には、javacコマンドの-dオプションを使う
<構文>
javac -d クラスファイルの出力先ディレクトリ コンパイルするファイルのパス
<例>
javac -d mods/test src/test/module-info.java src/test/com/sample/Main.java
モジュールの実行
モジュールの実行には、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
モジュールの情報を確認する
そのモジュールがどのようなパッケージを公開しているのか、またはどのようなモジュールに依存しているかの情報を確認するには、以下の様なコマンドがある。
(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
依存関係を調べる
クラス・モジュール等の依存関係を調べるには、以下のコマンドを使用する。
(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
以下省略
非公開パッケージを一時的に公開する
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
Java Silverの学習は、「Java SE11 Silver 問題集」を使い行っています。
コメント