Eclipse中的擴展點機制存在的理由
朱興(zhu_xing@live.cn)
眾所周知,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之上做的有力補充。
本博客中的所有文章、隨筆除了標題中含有引用或者轉載字樣的,其他均為原創。轉載請注明出處,謝謝!