有人稱 OSGi 是「Spring 之後的下一個 Big Thing」,但深度使用數年後,作者對其產生愛恨交織的複雜情感:肯定其高模組化、微服務架構優勢,卻痛恨其將技術複雜度推向新高度。本文從實戰角度剖析 OSGi 的優勢陷阱,並對比 EJB 歷史,反思模組化標準化的代價。
MANIFEST.MF 中 Import-Package/Export-Package 帶版本區間,將架構約束前置至構建期,強制模組化設計。手寫 BundleActivator 追蹤服務、狀態機管理依賴順序,代碼冗長易錯。Spring DM(現 Spring Dynamic Modules) 以聲明式 XML/@Bean 大幅簡化:容器自動掃描、註冊、注入 OSGi 服務,讓開發者專注業務邏輯。作者直言:「沒有 Spring DM 絕不碰 OSGi 專案。」
ClassNotFoundException/LinkageError。調整 Import-Package 版本區間、添加 DynamicImport-Package、拆分 Bundle、使用 Fragment Bundle 掛載資源……每次構建都在與清單頭博鬥,樣板化配置蔓延全專案。
Spring DM 雖屏蔽服務註冊細節,但無法解決 ClassLoader 隔離導致的類衝突、第三方庫非 OSGi 化、資源載入路徑差異等根本問題,開發者仍需深入理解 OSGi 類加載機制才能除錯。
在引入 OSGi 前,嚴格驗證:
java.lang.ModuleLayer (JDK 9+) 輕量隔離?作者警示:EJB 曾因過度複雜催生 Spring,OSGi 若不克制複雜度、降低認知門檻,恐重蹈覆轍。時間將驗證一切,但當下,「簡單可行」勝過「理論完美」。