Java Silver SE11 11章
黒本をもとに学んだことをアウトプットしていきます。
主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。
モジュール
複数のパッケージをまとめて管理する単位のこと。
モジュール内のパッケージは、明示しなければ非公開パッケージとなり、パッケージに含まれるクラスがpublicであったとしても、外部のモジュールからアクセスできなくなる。
プラットフォームモジュール
標準クラスライブラリなど、あらかじめ用意されているライブラリを提供しているモジュールのこと。
例として、java.langやjava.util, java.ioパッケージなどをまとめているのが、java.baseモジュール
である。このモジュールは自動的に読み込まれる。
module-info.java
対象のモジュールの設定内容を記載するファイルに該当する。
下記2点を記述する。
- どのパッケージを公開するのか
- 他のどのモジュールを使用するのか
モジュール用のディレクトリにこのファイルを作り、他のソースファイルとコンパイルすることで、モジュールを作成できる。
module test {}
moduleの後に、モジュール名を記述し、公開するパッケージや利用する外部モジュールを「{}」内に記述する。
(何も書かない場合、全てのパッケージを公開せず、どの外部モジュールも利用しないことを意味する。)
module test {
exports com.sample; // 公開するパッケージ
requires hello; // 利用する他のモジュール
}
推移的な依存関係
module1 → module2 → module3
上記なような推移的な依存関係を表した「モジュールグラフ」がある。
これはmodule1はmodule2に依存
し、module2はmodule3に依存
していることを示している。
「この依存関係」かつ「module1がmodule3のクラスを利用する」ためには、各module-info.java
を以下のように書く。
module module1 {
requires module2;
}
// module1はmodule2を利用できる
module module2 {
requires transitive module3;
}
// module2はmodule3を利用できる
// 「transitive」により、module1はmodule3を利用できる
ディレクトリ構成
モジュールのルートディレクトリをtestとすると、module-info.javaはその配下に置く。
current
|-src
| |-test
| |-com
| | |-sample
| | |- Main.java
| |-module-info.java
|-mods
|-test
src:ソースファイルのルートディレクトリ
test:モジュールのルートディレクトリ
com:パッケージのルートディレクトリ
mods:コンパイルの出力先
構文
以下に試験対策として、構文を記述していく。
コンパイル
コンパイルするためのコマンド。
javac -d クラスファイルの出力先ディレクトリ コンパイルするファイルパス
javac -d mods/test src/test/module-info.java src/test/com/sample/Main.java
module-info.javaも同時に、コンパイルを行うことに注意する。
クラスの実行
エントリーポイントを持つクラスを実行するためのコマンド。
java --module-path モジュールのルートディレクトリ -m 実行したいモジュールのクラス
java --module-path mods -m test/com.sample.Main
jarコマンド
モジュールをjarコマンドで、1つにまとめることができる。
複数のクラスをまとめたjarファイルを作成する。
jar --create --file=jarファイル名 --main-class=エントリーポイントを持つクラス -C jarファイルに含めるファイルがあるディレクトリ
jar --create --file=mlib/test.jar --main-class=com.sample.Main -C mods/test
解説
mlibディレクトリにtest.jarファイルを新規作成する。
エントリーポイントを持っている「com.sample.Main」を指定する。
mods/testディレクトリ内にあるファイルが含まれる。
最終的に、mlib/testディレクトリにtest.jarファイルが作成される。
モジュールの設定情報確認
module-info.javaに設定したモジュールの情報を確認するためのコマンドがある。
java --describe-module
jmod describe
非公開パッケージの一時利用
module-info.javaにてexportsされていないパッケージを、一時的に利用してコンパイルすることができる。この時javacコマンドのオプションを使用する。
-add-exports