模組化是將系統分解為獨立、可替換的模組,各模組透過標準化介面通訊。在軟體工程中,模組化等同於「關注點分離」,目標是低耦合、高內聚,讓開發、測試、維護更容易。
Java 早期僅有 package 作為命名空間與存取控制單位,缺乏:
因此 Java 生態系長期依賴建構工具(Maven、Gradle)與框架(OSGi)彌補缺口。
每個 JAR(Log4j、Hibernate、Tomcat)本質上都是一個模組:
問題:傳遞性依賴常引入不需要的 JAR(如 Log4j 1.2.15 引入 JMS、JavaMail),造成「依賴地獄」。
log4j-1.2.15.jar 檔名含版本。| 面向 | 效益 |
|---|---|
| 測試 | 小模組易於單元測試,GUI 難測試但核心邏輯可獨立測試 |
| 演進 | 各模組可獨立升級,穩定模組長期不變 |
| 專案管理 | 跨團隊並行開發,介面契約先行 |
| 依賴協調 | 明確知曉執行時使用的具體版本 |
Java Classpath 扁平化:所有類別互見,順序決定優先級。
編譯時依賴 A-1.1,執行時卻載入 A-1.2 → 可能出現 NoSuchMethodError。
OSGi 透過每模組一個 ClassLoader 實現執行期隔離,強制依賴檢查。
MANIFEST.MF 宣告 Import-Package/Export-Package,執行期驗證依賴。Eclipse 3.0+、JBoss、WebLogic、WebSphere 皆採用 OSGi 核心。module-info.java、module 關鍵字,強封裝內部 API。JDK 9 正式納入。IDE(Eclipse/IntelliJ/NetBeans)、建構工具、瀏覽器皆採用 Plugin 模式:宿主定義 SPI,外掛實作介面。Plugin 之間同樣面臨版本衝突與依賴管理問題。
模組化是大型系統演進的必經之路。Java 從缺乏原生支援,經由 OSGi 實踐,到 JDK 9 Jigsaw 標準化,生態系正逐步邁向「編譯時依賴=執行時依賴」的理想狀態。開發者應理解模組化核心概念,善用建構工具與執行時模組系統,避免依賴地獄。