支援外掛程式的機制是用 OSGi 架構來實作的。 從這個角度來看,外掛程式和 OSGi 軟體組是同一回事。 軟體組及其相關類別會指定和實作 Java 類別載入、必備項目管理及軟體組生命周期的程序。 在這項討論的其餘部分中,除非是討論架構中的特定類別,否則,我們將交互使用外掛程式和軟體組這兩個詞彙。
Plugin 類別代表在平台中執行的外掛程式。 它是一個便於將外掛程式生命周期的各個方面及其整體語意集中起來的所在。 外掛程式可以實作其生命周期在啟動和停止方面的特殊功能。 每個生命周期方法都含有一個參照,指向可提供其他資訊的 BundleContext。
生命周期的啟動部分值得特別討論。 我們已經看到,並不需要執行外掛程式的任何程式碼,就可以從外掛程式的 Manifest 檔中取得外掛程式的相關資訊。 通常,工作台中的某個使用者動作會引起一個需要啟動外掛程式的事件鏈。 從實作觀點來看,外掛程式絕不在必須載入外掛程式所包含的類別之前啟動。
start 方法是一個便於實作外掛程式起始設定和登錄行為的位置。 不過,您必須瞭解,外掛程式可以在許多不同的情況中啟動。 像取得圖示來裝飾物件之類的簡單事情,也可能造成載入某個外掛程式類別,從而啟動了您的外掛程式。 過於急切的起始設定有可能造成在尚未需要之時,便過早載入外掛程式的程式碼和資料。 所以,請務必仔細關注外掛程式的初值設定作業,考慮在啟動時執行初值設定的替代方案。
OSGi 的「軟體組」專有名詞和平台的「外掛程式」專有名詞在生命周期的管理上是相應的。 當外掛程式啟動時,會提供指向 BundleContext 的參照給它,供它從中取得外掛程式的相關資訊。 BundleContext 也可用來瞭解系統中的其他軟體組/外掛程式。
您可以利用 BundleContext.getBundles() 來取得系統中所有軟體組的陣列。 您也可以登錄 BundleEvent 的接聽器,使您的外掛程式得知其他軟體組生命周期狀態的變更。 請參閱 BundleContext 和 BundleEvent 的 javadoc,以取得詳細資訊。
在 3.0 之前,提供外掛程式登錄 (IPluginRegistry) 來提供類似的資訊。 比方說,您可以向它查詢系統中所有外掛程式的外掛程式描述子。 現在,這個登錄即將棄用,BundleContext 應該可用於這個目的。 現在,平台登錄專用於延伸規格和延伸點的相關資訊。
BundleActivator 介面定義了 Plugin 中所實作的啟動和停止行為。 雖然 Plugin 類別是便於實作這個功能的位置,但外掛程式開發人員完全可以在適合於外掛程式設計的任何類別中,自由實作 BundleActivator 的介面。 事實上,如果您的外掛程式沒有特定的生命周期管理需求,它完全不需要實作這個介面。
在每個外掛程式之下,都有架構所管理的 OSGi 軟體組。 軟體組是模組運作的 OSGi 單元。 基本上,軟體組只是平台中所安裝的檔案(資源和程式碼)集合。 每個軟體組都有它自己的 Java 類別載入器,且包括用來啟動、停止或解除安裝它本身的通訊協定。 從 Eclipse 平台的角度來看,軟體組只是一個實作類別。 外掛程式開發人員並不繼承軟體組類別,而是利用 Plugin 或其他 BundleActivator 實作來代表外掛程式。