Java モジュールシステムの使い方
Java9から導入されたモジュールシステムについて解説する
①プロジェクトを作成
下記プロジェクトを作成してモジュールの使い方を解説する
・parent
・child
・grandchild
②module-info.javaを作成
①で作成したプロジェクトに「module-info.java」ファイルを作成する
格納先:/プロジェクト名/src/module-info.java
※参考 記述用語
・exports
モジュールを他のパッケージからアクセスできるようにする
・requires
モジュールを読み込む
・requires transitive
モジュールを間接的に読み込む
③各プロジェクトにクラスを作成
■parentプロジェクト
・HelloParent.java
package parent;
public class HelloParent {
public void hello() {
System.out.println("Hello Parent!");
}
}
■childプロジェクト
・ChildMain.java
package child;
import parent.HelloParent;
public class ChildMain {
public static void main(String[] args) {
HelloParent hp = new HelloParent();
hp.hello();
}
}
・HelloChild.java
package child;
public class HelloChild {
public void hello() {
System.out.println("Hello Child!");
}
}
■grandchildプロジェクト
・GrandchildMain.java
package grandchild;
import child.HelloChild;
public class GrandchildMain {
public static void main(String[] args) {
HelloChild hc = new HelloChild();
hc.hello();
}
}
④プロジェクトにモジュールパスを設定
・childプロジェクトのモジュールパスに「parent」を設定
・grandchildプロジェクトのモジュールパスに「child」を設定
プロジェクトを右クリックし、モジュールパスを設定する
・childプロジェクト
・grandchildプロジェクト
⑤module-info.javaを編集Ⅰ
parentプロジェクトのパッケージを外部に公開し、childプロジェクトで読み込み
・parentプロジェクトのmodule-info.java
module parent {
//parentプロジェクトを他のパッケージからアクセスできるようにする
exports parent;
}
childプロジェクトのmodule-info.java
//parentモジュールを読み込む
module child {
requires parent;
}
ChildMain.javaを実行するとparentプロジェクトの「HelloParentメソッド」が実行できるようになった事が確認できる
⑥module-info.javaを編集Ⅱ
childプロジェクトのパッケージを外部に公開し、grandchildプロジェクトで読み込み
・childプロジェクトのmodule-info.java
module child {
//parentモジュールを読み込む
requires parent;
///childプロジェクトを他のパッケージからアクセスできるようにする
exports child;
}
・grandchildプロジェクトのmodule-info.java
//parentモジュールを読み込む
requires parent;
GrandchildMain.javaを実行するとparentプロジェクトの「HelloChildメソッド」が実行できるようになった事が確認できる
⑦モジュールを間接的に読み込む
このままではgrandchildプロジェクトでparentモジュールを使用することはできない
childモジュールで読み込んでいるparentモジュールをgrandchildプロジェクトでも使用できるようにするには「requires transitive」を記述する
※④と同様にgrandchildプロジェクトにもparentモジュールパスを設定しておく
・childプロジェクトのmodule-info.java
module child {
//parentモジュールを読み込む
//requires parent; ←コメントアウトしておく
//childプロジェクトを他のパッケージからアクセスできるようにする
exports child;
//childモジュールを読み込んだ場合はparentモジュールも使えるようにする
requires transitive parent;
}
・GrandchildMain.java
package grandchild;
import child.HelloChild;
import parent.HelloParent;
public class GrandchildMain {
public static void main(String[] args) {
HelloChild hc = new HelloChild();
hc.hello();
//parentプロジェクトのメソッド
HelloParent hp = new HelloParent();
hp.hello();
}
}
GrandchildMain.javaを実行するとparentプロジェクトの「HelloParentメソッド」も実行できるようになった事が確認できる