jdk9模塊化--引用模塊


上一次簡單寫了一個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同樣的模塊未導出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM