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

模組化 Java 核心概念與演進歷程

     編輯:Java 相關知識

什麼是模組化?

模組化是將系統分解為獨立、可替換的模組,各模組透過標準化介面通訊。在軟體工程中,模組化等同於「關注點分離」,目標是低耦合、高內聚,讓開發、測試、維護更容易。

Java 語言層面的模組化缺失

Java 早期僅有 package 作為命名空間與存取控制單位,缺乏:

  • 模組版本管理
  • 明確的依賴宣告
  • 執行期隔離(ClassLoader 隔離)
  • 封裝內部實現(強封裝)

因此 Java 生態系長期依賴建構工具(Maven、Gradle)與框架(OSGi)彌補缺口。

類庫即模組

每個 JAR(Log4j、Hibernate、Tomcat)本質上都是一個模組:

  • 公開 API(public 類別/介面)
  • 私有實現(package-private 或非導出套件)
  • 傳遞性依賴

問題:傳遞性依賴常引入不需要的 JAR(如 Log4j 1.2.15 引入 JMS、JavaMail),造成「依賴地獄」。

版本與相容性

  • 慣例:log4j-1.2.15.jar 檔名含版本。
  • 語義化版本:主版本.次版本.修訂版,主版本變更代表不相容。
  • 編譯時與執行時 Classpath 可能不同版本 → 連結錯誤。

模組化的價值

面向效益
測試小模組易於單元測試,GUI 難測試但核心邏輯可獨立測試
演進各模組可獨立升級,穩定模組長期不變
專案管理跨團隊並行開發,介面契約先行
依賴協調明確知曉執行時使用的具體版本

編譯時 vs 執行時 Classpath

Java Classpath 扁平化:所有類別互見,順序決定優先級。
編譯時依賴 A-1.1,執行時卻載入 A-1.2 → 可能出現 NoSuchMethodError。
OSGi 透過每模組一個 ClassLoader 實現執行期隔離,強制依賴檢查。

ClassLoader 隔離實例:Servlet 容器

  • 每個 WebApp 獨立 ClassLoader,類別不互見。
  • 熱部署原理:丟棄舊 ClassLoader → GC 回收類別 → 新 ClassLoader 載入新版本。

模組系統演進時間軸

  1. JSR 277 (Java Module System):早期嘗試,已廢止。
  2. JSR 291 (OSGi):Java 領域最成熟模組系統,MANIFEST.MF 宣告 Import-Package/Export-Package,執行期驗證依賴。Eclipse 3.0+、JBoss、WebLogic、WebSphere 皆採用 OSGi 核心。
  3. Jigsaw (JSR 376 / JDK 9):模組化 JDK 自身,引入 module-info.java、module 關鍵字,強封裝內部 API。JDK 9 正式納入。
  4. JSR 294 (Simple Module System):提議在語言層面統一模組中繼資料,供 Jigsaw、OSGi 共用。

Plugin 架構與模組化

IDE(Eclipse/IntelliJ/NetBeans)、建構工具、瀏覽器皆採用 Plugin 模式:宿主定義 SPI,外掛實作介面。Plugin 之間同樣面臨版本衝突與依賴管理問題。

總結

模組化是大型系統演進的必經之路。Java 從缺乏原生支援,經由 OSGi 實踐,到 JDK 9 Jigsaw 標準化,生態系正逐步邁向「編譯時依賴=執行時依賴」的理想狀態。開發者應理解模組化核心概念,善用建構工具與執行時模組系統,避免依賴地獄。

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