上一次簡單寫了一個module並進行調用,這次會嘗試模塊間引用其他模塊
首先列出所有文件
+--src
+--com.moduleA
+--module-info.java
+--com
+--moduleA
+--ModuleA.java
+--com.main
+--com
+--main
+Main.java
模塊引用
moduleA的module-info
module com.moduleA {
exports com.moduleA;
}
ModuleA.java
package com.moduleA;
public class ModuleA {
public void doModule() {
System.out.println("from module1");
}
}
main的module-info
module com.main {
requires com.moduleA;
}
Main.java
package com.main;
import com.moduleA.*;
public class Main {
public static void main(String[] args) {
ModuleA m1=new ModuleA();
m1.doModule();
}
}
在src同級目錄運行下面命令進行編譯
>javac -d mods/com.moduleA src\com.moduleA\module-info.java src\com.moduleA\com\moduleA\ModuleA.java
>javac --module-path mods -d mods/com.main src/com.main/module-info.java src/com.main/com/main/Main.java
然后就可以運行main模塊了
>java --module-path mods -m com.main/com.main.Main
from module1
找不到模塊
模塊編譯時如果缺少對應的申明會被校驗
缺少模塊
刪除生成的moduleA,運行main,會有如下報錯
Error occurred during initialization of boot layer
java.lang.module.FindException: Module com.moduleA not found, required by com.main
就算程序中沒有使用到對應的模塊,只要缺少requires中的包就會提示以上錯誤。
缺少export
當對moduleA不進行export,在編譯main時會出現,同樣javac也可以識別出moduleA的存在,以及它並未被導出
src\com.main\com\main\Main.java:2: 錯誤: 程序包 com.moduleA 不可見
import com.moduleA.*;
^
(程序包 com.moduleA 已在模塊 com.moduleA 中聲明, 但該模塊未導出它)
1 個錯誤
缺少require
當main的module-info中不標明requires modualA,編譯時就會出現如下錯誤,值得注意的是javac能識別出已經存在的moduleA,並說明了未讀取該模塊
src\com.main\com\main\Main.java:2: 錯誤: 程序包 com.moduleA 不可見
import com.moduleA.*;
^
(程序包 com.moduleA 已在模塊 com.moduleA 中聲明, 但模塊 com.main 未讀取它)
1 個錯誤
當main不require,moduleA也不export的情況下,會優先顯示該錯誤,所以javac首先會找到該類,然后通過export和requires進行控制。
export范圍
在module-info中定義達的export,是暴露一個package下所有類,且需不會讀取子package的內容,例如com.modulaA只會export該package下的類,其子package下的類並不會被包含在內,如果子package中的類被引用會提示缺少export同樣的模塊未導出。