眾所周知,Eclipse平台本身就作為一個成功的OSGI應用,從技術層面講,Eclipse本身就是由OSGI協 議驅動的(我想,這句話大家已經聽的很多遍了~_~)。同時Eclipse對OSGI組件機制做了有力的擴充,也 就是我們所熟知的擴展點(Extension Point)機制,關於擴展點的支持也作為Equinox(Eclipse的OSGI 協議實現)一部分呈現給了廣大的Eclipse開發者和用戶。關於為什麼會存在擴展點這個補充,也是國外 技術論壇上經常討論的話題,在這也斗膽猜測一把,僅供大家參考。
【OSGI的關鍵特性和適用場景】
OSGI為我們提供了一個追求模塊化的方式來開發、部署、運行、管理組件(OSGI Bundle)的機制,其 主要的技術特征包括模塊化、生命周期管理、松耦合交互等。OSGI為我們提供了組件模塊化所需要的技術 ,並允許以服務等方式來實現模塊之間的動態松耦合交互,這也就為我們開發盼望已久的Pluginable System打下了堅實的基礎(有關OSGI的技術,可以參加OSGI協議和國外論壇上的一些關於OSGI具體應用的 討論)。本質上講,OSGI在追求組件模塊化,並希望組件本身具備黑盒的效果,其並沒有投入很大精力來 關注如何讓一個組件更容易擴展,更加開放。
通過上面的闡述我們可以看出來,OSGI本身適用於那種建立模塊化、動態管理、即插即用的組件化系 統,如果應用於產品軟件的開放,對建立一個可靠的內核是非常有用的,OSGI對應的一些成功應用包括 Eclipse、JBoss AS、IBM Websphere等。
【Eclipse的需求】
Eclipse本身作為一個基礎平台存在,其關鍵需求就是來方便用戶擴展,並能夠很方便的和Eclipse平 台本身做無縫集成。說白了,在Eclipse中一個組件(Eclipse Plug-in)的任務大致為二:提供擴展實現 或者聲明擴展需求(當然,不完全針對庫插件、feature…)。我們知道,一個軟件產品的技術實現必須 要以符合產品需求為基礎,Eclipse作為一個軟件產品最大的需求就是如何方便的允許用戶擴展並無縫地 集成這些擴展。
如果要滿足Eclipse的這種需求,需要一個組件(Eclipse plug-in)還需要具備什麼關鍵特質呢?開 放、易擴展!!!
顯然,OSGI本身並不能滿足Eclipse的部分關鍵需求(面向開發者和用戶的需求),但是OSGI所帶來的 模塊化、聲明周期管理、懶加載等機制都是Eclipse迫切需要的,自然選擇了OSGI來作為Eclipse內核的驅 動協議。考慮到擴展和便於無縫集成這兩大關鍵需求,Eclipse在OSIG之上面向用戶提供了擴展點的機制 ,以一種xml描述的方式來配置組件之間的擴展關系,涉及到的三個核心概念便是我們熟知的:擴展點 (Extension Point)、擴展(Extension)和擴展注冊表(Extension Registry)。
【實例討論】
上面說了一些偏於抽象的東西,下面配合幾個實例來大致說明一下。
首先我們討論一個偏於理論的例子,假設我們現在當前系統有兩個OSGI bundle,再加入第三個陌生的 bundle,那這個新的bundle是不能被自動發現的(auto-discovered,自己發明的~_~),除非在被顯示調 用的情況下。同比,如果當前系統中有一個plug-in,其本身聲明了一個擴展點(host plug-in),然後 系統中引入了一個新的plug-in,按照host plug-in定義的擴展契約提供了擴展(extesion plug-in), 那麼這個新的plug-in是可以被自動發現的,host plug-in可以借助eclipse擴展注冊表查找對應的擴展, 而同時避免了兩個plug-in之間的緊密耦合(說明:有人以為extension plug-in和host plug-in之間是緊 密耦合的,我覺得更合適的說法是plug-in是開發的)。
我們知道Eclipse本身的體系架構是:微內核(micro kernel)、核心插件(core plug-ins)和用戶 應用插件(application plug-ins)。
上圖中的runtime、workbench和resource就是Eclipse所謂的核心插件,而JDT恰恰是在這些核心插件 的基礎上提供擴展,並做無縫集成;同時也定義了一些擴展點,供JDT自身或者其他擴展插件使用並做無 縫集成。
對普通Eclipse工具用戶而言,如果沒有擴展點的機制,用戶能夠方便的將第三方工具安裝(本質上是 集成)到Eclipse中嗎?是不是要關心一些技術細節啊?
【總結】
上面,一直在說Eclipse plug-in在OSGI bundle的基礎上在追求開放和擴展,其實從技術本質上講, Eclipse是對OSGI協議在插件間的交互方式做了補充,擴展和擴展點也成為了我們在Eclipse插件開發過程 中最主要的插件間交互方式了,而OSGI中定義的組件間松耦合交互方式(OSGI Service)卻並沒有很大的 用武之地(對用戶而言)。說到這裡,可能會給大家造成一個疑問: Eclipse擴展點機制這麼好,為什麼 不加入OSGI協議呢?需求不同。
最後再回顧一下,Eclipse之所以提供了擴展點機制,本質上取決於Eclipse自身的部分關鍵需求:擴 展和集成。OSGI協議本身尤其應用場景,Eclipse的擴展點機制是針對Eclipse自身需求在OSGI之上做的有 力補充。