Java 模塊化系統自提案以來歷經多年,最終以 JSR-376 定稿,隨 Java 9 正式發布。2015 年 9 月 OpenJDK 早期構建版本首次包含 Jigsaw 項目原型。本文基於早期構建版本 (JDK 9-ea+jigsaw-nightly),通過完整實戰演示:模塊定義、編譯、運行、依賴聲明、導出封裝,揭示模塊系統核心機制與優勢。
傳統 JAR 只是類文件的壓縮包,存在嚴重缺陷:
模塊系統解決方案:
/Library/Java/JavaVirtualMachines/;JAVA_HOME,使用 setjdk 腳本切換版本;java -version 輸出包含 jigsaw-nightly 即成功。示例代碼倉庫:https://github.com/sandermak/jigsaw-firstlook
src
├── module1
│ ├── module-info.java
│ └── com/test/TestClassModule1.java
└── module2
├── module-info.java
└── com/moretest/TestClassModule2.java
關鍵點:模塊目錄下必須有 module-info.java;類必須屬於具名包(不可用默認包)。
module2(被依賴方):
// module-info.java
module module2 {
exports com.moretest; // 導出包,使公共類型可見
}
// com/moretest/TestClassModule2.java
package com.moretest;
public class TestClassModule2 {
public static String msg() {
return "from module 2!";
}
}
module1(依賴方):
// module-info.java
module module1 {
requires module2; // 聲明依賴
}
// com/test/TestClassModule1.java
package com.test;
import com.moretest.TestClassModule2;
public class TestClassModule1 {
public static void main(String[] args) {
System.out.println("Hi from " + TestClassModule2.msg());
}
}
expected 'module';module module1 { } → 編譯通過,但 module1 看不見 module2 的包(封裝生效);exports com.moretest; → 仍報錯,因 module1 未聲明依賴;requires module2; → 編譯成功!輸出目錄 mods/ 下整齊分離兩個模塊編譯產物。
java -p mods -m module1/com.test.TestClassModule1
-p / --module-path:指定模塊路徑(替代類路徑 -cp);-m / --module:指定啟動模塊/主類;Hi from from module 2!.jmod 格式,包含原生代碼、配置文件等,面向鏈像構建;jlink 工具生成 定製運行時鏡像,僅包含應用所需模塊,優勢:體積極小、啟動極快、攻擊面最小、優化空間最大;Java 9 模塊化系統通過 module-info.java 聲明模塊名、導出包、依賴模塊,構建了強封裝、可聲明依賴、可驗證的模塊圖。雖遷移既有項目有成本,但對大型系統、框架開發、JDK 精簡化具有革命性意義。Jigsaw 終於讓 Java 擁有了真正的模塊化原生支持。