・自動モジュールから名前付きモジュールを参照
・無名モジュールから自動モジュール、名前付きモジュールを参照
上記は--add-modulesで指定すれば参照できます。
--add-modulesで指定せずに--module-pathで指定した場合、参照できません。
--add-modulesと--module-pathにはどのような違いがあるのでしょうか?
それぞれの動作について教えていただきたいです。
<module-info.java>
module namedA {}
<module-info.java>
module namedB {}
<module-info.java>
module namedC {}
<packageA.java>
package packageA;
public class packageA {
public static void main(String[] args) {
System.out.println(packageA.class);
System.out.println(packageB.packageB.class);
System.out.println(packageC.packageC.class);
}
}
<packageB.java>
package packageB;
public class packageB {
public static void main(String[] args) {
System.out.println(packageA.packageA.class);
System.out.println(packageB.class);
System.out.println(packageC.packageC.class);
}
}
<packageC.java>
package packageC;
public class packageC {
public static void main(String[] args) {
System.out.println(packageA.packageA.class);
System.out.println(packageB.packageB.class);
System.out.println(packageC.class);
}
}
<コンパイル・jarファイル化>
cd /temporary & javac -encoding utf-8 ./tempA/module-info.java ./tempA/packageA/packageA.java ./tempB/packageB/packageB.java ./tempC/packageC/packageC.java & javac -encoding utf-8 ./tempB/module-info.java ./tempA/packageA/packageA.java ./tempB/packageB/packageB.java ./tempC/packageC/packageC.java & javac -encoding utf-8 ./tempC/module-info.java ./tempA/packageA/packageA.java ./tempB/packageB/packageB.java ./tempC/packageC/packageC.java & jar -cf ./tempA/automaticA.jar -C ./tempA ./packageA/packageA.class & jar -cf ./tempB/automaticB.jar -C ./tempB ./packageB/packageB.class & jar -cf ./tempC/automaticC.jar -C ./tempC ./packageC/packageC.class
<ディレクトリ構造>
cd /temporary & tree /f
C:.
│ java
│ javac
├─tempA
││ automaticA.jar
││ module-info.class
││ module-info.java
│└─packageA
│ packageA.class
│ packageA.java
├─tempB
││ automaticB.jar
││ module-info.class
││ module-info.java
│└─packageB
│ packageB.class
│ packageB.java
└─tempC
││ automaticC.jar
││ module-info.class
││ module-info.java
│└─packageC
│ packageC.class
│ packageC.java
①--add-modules有)自動モジュールAから無名モジュールB、名前付きモジュールCを参照
cd /temporary & java --show-module-resolution -cp ./tempB -p ./tempA/automaticA.jar;./tempC --add-modules namedC --add-exports namedC/packageC=automaticA -m automaticA/packageA.packageA
root automaticA file:///C:/temporary/./tempA/automaticA.jar automatic
root namedC file:///C:/temporary/./tempC/
class packageA.packageA
class packageB.packageB
class packageC.packageC
②--add-modules無)自動モジュールAから無名モジュールB、名前付きモジュールCを参照
cd /temporary & java --show-module-resolution -cp ./tempB -p ./tempA/automaticA.jar;./tempC --add-exports namedC/packageC=automaticA -m automaticA/packageA.packageA
root automaticA file:///C:/temporary/./tempA/automaticA.jar automatic
class packageA.packageA
class packageB.packageB
Exception in thread "main" java.lang.NoClassDefFoundError: packageC/packageC
③--add-modules有)自動モジュールAから自動モジュールB、Cを参照
cd /temporary & java --show-module-resolution -p ./tempA/automaticA.jar;./tempB/automaticB.jar;./tempC/automaticC.jar; --add-modules automaticB,automaticC -m automaticA/packageA.packageA
root automaticA file:///C:/temporary/./tempA/automaticA.jar automatic
root automaticB file:///C:/temporary/./tempB/automaticB.jar automatic
root automaticC file:///C:/temporary/./tempC/automaticC.jar automatic
class packageA.packageA
class packageB.packageB
class packageC.packageC
④--add-modules無)自動モジュールAから自動モジュールB、Cを参照
cd /temporary & java --show-module-resolution -p ./tempA/automaticA.jar;./tempB/automaticB.jar;./tempC/automaticC.jar; -m automaticA/packageA.packageA
root automaticA file:///C:/temporary/./tempA/automaticA.jar automatic
automaticA requires automaticB file:///C:/temporary/./tempB/automaticB.jar automatic
automaticA requires automaticC file:///C:/temporary/./tempC/automaticC.jar automatic
class packageA.packageA
class packageB.packageB
class packageC.packageC
⑤--add-modules有)名前付きモジュールAから自動モジュールB、Cを参照
cd /temporary & java --show-module-resolution -p ./tempA;./tempB/automaticB.jar;./tempC/automaticC.jar --add-modules automaticB,automaticC --add-reads namedA=automaticB,automaticC -m namedA/packageA.packageA
root automaticB file:///C:/temporary/./tempB/automaticB.jar automatic
root namedA file:///C:/temporary/./tempA/
root automaticC file:///C:/temporary/./tempC/automaticC.jar automatic
class packageA.packageA
class packageB.packageB
class packageC.packageC
⑥--add-modules無)名前付きモジュールAから自動モジュールB、Cを参照
cd /temporary & java --show-module-resolution -p ./tempA;./tempB/automaticB.jar;./tempC/automaticC.jar --add-reads namedA=automaticB,automaticC -m namedA/packageA.packageA
root namedA file:///C:/temporary/./tempA/
class packageA.packageA
Exception in thread "main" java.lang.NoClassDefFoundError: packageB/packageB
⑦--add-modules有)名前付きモジュールAから名前付きモジュールB、Cを参照
cd /temporary & java --show-module-resolution -p ./tempA;./tempB;./tempC --add-modules namedB,namedC --add-reads namedA=namedB,namedC --add-exports namedB/packageB=namedA --add-exports namedC/packageC=namedA -m namedA/packageA.packageA
root namedC file:///C:/temporary/./tempC/
root namedB file:///C:/temporary/./tempB/
root namedA file:///C:/temporary/./tempA/
class packageA.packageA
class packageB.packageB
class packageC.packageC
⑧--add-modules無)名前付きモジュールAから名前付きモジュールB、Cを参照
cd /temporary & java --show-module-resolution -p ./tempA;./tempB;./tempC --add-reads namedA=namedB,namedC --add-exports namedB/packageB=namedA --add-exports namedC/packageC=namedA -m namedA/packageA.packageA
root namedA file:///C:/temporary/./tempA/
class packageA.packageA
Exception in thread "main" java.lang.NoClassDefFoundError: packageB/packageB
⑨--add-modules有)無名モジュールAから自動モジュールB、名前付きモジュールCを参照
cd /temporary & java --show-module-resolution -cp ./tempA -p ./tempB/automaticB.jar;./tempC --add-modules automaticB,namedC --add-exports namedC/packageC=ALL-UNNAMED packageA.packageA
root namedC file:///C:/temporary/./tempC/
root automaticB file:///C:/temporary/./tempB/automaticB.jar automatic
class packageA.packageA
class packageB.packageB
class packageC.packageC
⑩--add-modules無)無名モジュールAから自動モジュールB、名前付きモジュールCを参照
cd /temporary & java --show-module-resolution -cp ./tempA -p ./tempB/automaticB.jar;./tempC --add-exports namedC/packageC=ALL-UNNAMED packageA.packageA
class packageA.packageA
Exception in thread "main" java.lang.NoClassDefFoundError: packageB/packageB
<module-info.java>
module namedA {}
<packageA.java>
package packageA;
public class packageA {
public static void main(String[] args) throws Throwable {
System.out.println(Class.forName("packageB.packageB"));
}
}
<packageB.java>
package packageB;
public class packageB {
public static void main(String[] args) {
System.out.println(packageC.packageC.class);
}
}
<packageC.java>
package packageC;
public class packageC {}
<コンパイル・jarファイル作成>
cd /temporary & javac -encoding utf-8 ./tempA/module-info.java ./tempA/packageA/packageA.java ./tempB/packageB/packageB.java ./tempC/packageC/packageC.java & jar -cf ./tempB/automaticB.jar -C ./tempB ./packageB/packageB.class & jar -cf ./tempC/automaticC.jar -C ./tempC ./packageC/packageC.class
<ディレクトリ構造>
cd /temporary & tree /f
C:.
│ java
│ javac
├─tempA
││ module-info.class
││ module-info.java
│└─packageA
│ packageA.class
│ packageA.java
├─tempB
││ automaticB.jar
│└─packageB
│ packageB.class
│ packageB.java
└─tempC
││ automaticC.jar
│└─packageC
│ packageC.class
│ packageC.java
⑪--add-modules有
cd /temporary & java --show-module-resolution -p ./tempA;./tempB;./tempC --add-modules automaticB -m namedA/packageA.packageA
root automaticB file:///C:/temporary/./tempB/automaticB.jar automatic
root namedA file:///C:/temporary/./tempA/
automaticB requires automaticC file:///C:/temporary/./tempC/automaticC.jar automatic
class packageB.packageB
⑫--add-modules無
cd /temporary & java --show-module-resolution -p ./tempA;./tempB;./tempC -m namedA/packageA.packageA
root namedA file:///C:/temporary/./tempA/
Exception in thread "main" java.lang.ClassNotFoundException: packageB.packageB
⑬--add-modules無 -cp有
cd /temporary & java --show-module-resolution -cp ./tempB -p ./tempA;./tempB;./tempC -m namedA/packageA.packageA
root namedA file:///C:/temporary/./tempA/
class packageB.packageB
