首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 9 模塊化系統 (Jigsaw) 初探:從模塊定義、編譯、運行到未來展望的完整實戰

     編輯:Java 相關知識

前言:模塊化系統的漫長征程與破曉

Java 模塊化系統自提案以來歷經多年,最終以 JSR-376 定稿,隨 Java 9 正式發布。2015 年 9 月 OpenJDK 早期構建版本首次包含 Jigsaw 項目原型。本文基於早期構建版本 (JDK 9-ea+jigsaw-nightly),通過完整實戰演示:模塊定義、編譯、運行、依賴聲明、導出封裝,揭示模塊系統核心機制與優勢。

一、為什麼需要模塊?JAR 的痛點

傳統 JAR 只是類文件的壓縮包,存在嚴重缺陷:

  • 類路徑地獄:無法知曉依賴是否完整、是否存在版本衝突(同類不同版本)、運行時才發現缺失;
  • 無封裝邊界:JAR 內所有 public 類對外全部可見,無法隱藏內部實現;
  • 依賴不可聲明:JAR 間依賴關係無法元數據化,構建工具難以自動解析傳遞依賴。

模塊系統解決方案:

  1. 模塊為一等公民:封裝實現細節,僅導出必要 API;
  2. 精確依賴聲明:模塊描述符聲明導出包與依賴模塊,構建時即可驗證依賴完整性;
  3. 構建可靠模塊圖:運行時僅包含必要模塊,提升可維護性、可靠性、安全性;JDK 自身模塊化可生成精簡運行時鏡像。

二、安裝 JDK 9 早期構建版本

  • 下載含 Jigsaw 的 JDK 9 ea 版本;
  • macOS 解壓移至 /Library/Java/JavaVirtualMachines/;
  • 設置 JAVA_HOME,使用 setjdk 腳本切換版本;
  • 驗證:java -version 輸出包含 jigsaw-nightly 即成功。

示例代碼倉庫:https://github.com/sandermak/jigsaw-firstlook

三、第一個多模塊項目實戰

3.1 項目結構

src
├── module1
│   ├── module-info.java
│   └── com/test/TestClassModule1.java
└── module2
    ├── module-info.java
    └── com/moretest/TestClassModule2.java

關鍵點:模塊目錄下必須有 module-info.java;類必須屬於具名包(不可用默認包)。

3.2 代碼實現

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());
    }
}

3.3 編譯與報錯演進

  1. 空 module-info.java → 報錯 expected 'module';
  2. 添加模塊名 module module1 { } → 編譯通過,但 module1 看不見 module2 的包(封裝生效);
  3. module2 導出包 exports com.moretest; → 仍報錯,因 module1 未聲明依賴;
  4. module1 聲明依賴 requires module2; → 編譯成功!

輸出目錄 mods/ 下整齊分離兩個模塊編譯產物。

3.4 運行模塊化應用

java -p mods -m module1/com.test.TestClassModule1
  • -p / --module-path:指定模塊路徑(替代類路徑 -cp);
  • -m / --module:指定啟動模塊/主類;
  • 輸出:Hi from from module 2!

四、未來展望:模塊系統的更多可能

  • JMOD 格式:除 JAR 外,新增 .jmod 格式,包含原生代碼、配置文件等,面向鏈像構建;
  • 服務層 (ServiceLoader):模塊系統內置服務發現機制,通過接口綁定提供者與使用者,實現控制反轉,模塊系統擔任服務註冊中心;
  • JDK 自身模塊化:JDK 內部模塊化後,可使用 jlink 工具生成 定製運行時鏡像,僅包含應用所需模塊,優勢:體積極小、啟動極快、攻擊面最小、優化空間最大;
  • 遷移現有項目:嘗試將 OSGi 應用遷移至標準模塊系統,探索兼容性與互操作性。

總結

Java 9 模塊化系統通過 module-info.java 聲明模塊名、導出包、依賴模塊,構建了強封裝、可聲明依賴、可驗證的模塊圖。雖遷移既有項目有成本,但對大型系統、框架開發、JDK 精簡化具有革命性意義。Jigsaw 終於讓 Java 擁有了真正的模塊化原生支持。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved