プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

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メソッド」も実行できるようになった事が確認できる