產品發布後,難免會遇到用戶回報的緊急問題或小型缺陷。若等待下一個正式版本發布週期過長,且透過 Software Update 介面安裝更新對商業化 RCP 產品而言過於笨重,甚至可能因安裝環境客製化而失效。此時,Feature Patch(功能補丁) 是最靈活、輕量的解決方案。本文詳細說明如何基於 Equinox 架構,為 Eclipse 3.4 RCP 應用建立、部署 Feature Patch,並針對部署後常見問題提供診斷思路。
在 Eclipse 架構中,Plug-in(插件) 是功能實作的最小單位(對應 OSGi Bundle),但粒度過細,不利整體管理。Feature(功能部件) 將功能相關的插件組織起來,讓用戶以模組層級管理產品,支援品牌化、依賴聲明與更新管理。若 RCP 產品採 Feature 為安裝單位,單純替換 plugins 目錄下的 Jar 檔並不生效,必須以 Feature 為單位建立補丁,即 Feature Patch。
Feature Patch 特性:
Eclipse 插件版本採四段式 major.minor.service.qualifier:
| 段位 | 變更時機 |
|---|---|
| major | API 重大變更,minor/service 歸零 |
| minor | 對外可見的功能增強、效能優化、核心重構 |
| service | Bug 修正、編譯選項調整等小版本釋出 |
| qualifier | 每次 Build 的差異(如日期、建置編號) |
Equinox 載入規則:依序比較 major → minor → service → qualifier(ASCII 碼大者優先)。Feature 版本應反映其內含插件最典型的變更層級。
match 規則(在 feature.xml 定義相依性時指定)決定版本過濾邏輯:
perfect:版本號需完全相同equivalent:major/minor 相同,service ≥ 指定版本compatible:major 相同,minor/service ≥ 指定版本greaterOrEqual:major/minor/service 任一 ≥ 指定版本cn.myplugin)cn.myfeature_1.0.0)unpack="true")修改程式碼後,依修正規模調整版本:小型補丁僅遞增 qualifier(例:1.0.0.v20091225 → 1.0.0.v20100101),大型 Fix Pack 再調整 service。
File → New → Other → Plug-in Development → Feature Patch<featureID>.patchfeature.xml 編輯器的 Plug-ins 分頁加入需更新的插件,並同步更新 Patch 版本號Export → Plug-in Development → Deployable feature.qualifier,在 Options 分頁勾選 Qualifier replacement,替換字串 ASCII 碼需大於原版本eclipsec.exe -application org.eclipse.equinox.p2.metadata.generator.EclipseGenerator \
-metadataRepositoryName "[PATCH_NAME]" -metadataRepository file:[PATCH_LOCATION] \
-artifactRepository file:[PATCH_LOCATION] -source [PATCH_LOCATION] \
-flavor tooling -append -noDefaultIUs -inplace -nosplash
將產生的 features/、plugins/ 複製至產品安裝目錄,重啟應用即完成部署。為支援累積式補丁並安全移除舊版,建議結合 Link 機制:將補丁置於 Link 指向的獨立目錄,透過腳本自動化複製與清理 Eclipse 快取(-clean 參數),確保載入最新版本。
驗證三法:
Help → About → Plug-in Details 確認插件版本號Help → Software Updates 檢視 Patch 版本資訊若重啟後版本未更新,常見原因有二:
診斷思路: 啟動 OSGi Console(-console 參數),觀察 Bundle 狀態轉換:
INSTALLED → 相依性未解析(檢查 match rule)Bundle 狀態流轉:INSTALLED → RESOLVED → STARTING → ACTIVE(或 LAZY)。僅有滿足相依性才能進入 RESOLVED,進而啟動。