自 GlassFish v3 起,核心核心採用 OSGi(基於 HK2 與 Apache Felix)重構,實現模組化、輕量化、熱部署。本九部分專題將深入解析 GlassFish OSGi-JavaEE 技術棧,涵蓋 Web、EJB、CDI、JPA、Blueprint 等企業級規範在 OSGi 環境下的整合與開發實戰。
| 部分 | 主題 |
|---|---|
| Part 1 | GlassFish OSGi-JavaEE 概覽與企業級 OSGi 現狀(本文) |
| Part 2 | OSGi/Web 容器:開發與部署 Web Application Bundle (WAB) |
| Part 3 | OSGi/EJB 容器:EJB Bundle 開發與部署 |
| Part 4 | OSGi/CDI 整合:簡化企業級 OSGi 開發 |
| Part 5-6 | EAR 與 OSGi 整合:Apache Aries Application 與 EJB Bridge 實戰 |
| Part 7 | GlassFish、HK2、OSGi 三角關係與 HK2 未來展望 |
| Part 8 | 核心內核深度解析:模組配置、載入、啟動與擴展 |
| Part 9 | 貢獻 GlassFish OSGi 與 OSGi-JavaEE 社群流程 |
GlassFish OSGi-JavaEE = 企業級 OSGi 的 GlassFish 實現。 它打通 OSGi 動態模組系統與 JavaEE 成熟組件模型(EJB、JPA、JTA、CDI、JSF…),實現雙向互操作:
傳統扁平 Classpath 導致:
ClassNotFoundException大型系統演變成「義大利麵代碼」,模組間隱性依賴難以追蹤,微小變更引發連鎖崩潰,測試成本指數級上升。
JavaEE 部署即鎖定,無法運行時熱更新 Servlet、EJB、JSP,維護窗口極窄。
MANIFEST.MF 元資料(Export-Package/Import-Package、版本號)Bundle 狀態機:Installed → Resolved → Starting → Active → Stopping → Uninstalled。支援運行時安裝、更新、解除安裝,服務動態發現與綁定。
OSGi Enterprise 規範(R5+)定義:
META-INF/services 在 OSGi 失效問題| 類別 | API 範例 | Plain Bundle | Composite Bundle |
|---|---|---|---|
| A:容器管理組件 | EJB、CDI、Servlet、JSF、JAX-RS | ❌ | ✅ |
| B:平台服務 | JNDI、JTA、JDBC、JMS | ✅(透過 OSGi 服務) | ✅ |
| C:功能性 API | JAXB、JAXP、JPA | ✅(GlassFish 修正 ServiceLoader 問題) | ✅ |
JavaEE 採用嚴格階層類載入器(Bootstrap → Extension → Application → EAR → WAR),子不可見父同級類。OSGi 採用網狀委派,Bundle 間透過 Import/Export 精確連線。
傳統 ServiceLoader 依賴 TCCL 掃描 META-INF/services,OSGi 中:
internal 套件,不導出OSGi R5 引入 Service Loader Mediator 規範,GlassFish 實現透明橋接,讓既有代碼無修改運行。
Part 2 將實戰演示:開發與部署首個 Web Application Bundle (WAB) 到 GlassFish,深入理解 OSGi Web 規範與開發工具鏈。