眾所周知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對應的一些成功應用包括 EclipseJBoss ASIBM Websphere等
「Eclipse的需求」
Eclipse本身作為一個基礎平台存在其關鍵需求就是來方便用戶擴展並能夠很方便的和Eclipse平台本身做無縫集成說白了在Eclipse中一個組件(Eclipse Plugin)的任務大致為二提供擴展實現或者聲明擴展需求(當然不完全針對庫插件feature…)我們知道一個軟件產品的技術實現必須要以符合產品需求為基礎Eclipse作為一個軟件產品最大的需求就是如何方便的允許用戶擴展並無縫地集成這些擴展
如果要滿足Eclipse的這種需求需要一個組件(Eclipse plugin)還需要具備什麼關鍵特質呢?開放易擴展!!!
顯然OSGI本身並不能滿足Eclipse的部分關鍵需求(面向開發者和用戶的需求)但是OSGI所帶來的模塊化聲明周期管理懶加載等機制都是Eclipse迫切需要的自然選擇了OSGI來作為Eclipse內核的驅動協議考慮到擴展和便於無縫集成這兩大關鍵需求Eclipse在OSIG之上面向用戶提供了擴展點的機制以一種xml描述的方式來配置組件之間的擴展關系涉及到的三個核心概念便是我們熟知的擴展點(Extension Point)擴展(Extension)和擴展注冊表(Extension Registry)
「實例討論」
上面說了一些偏於抽象的東西下面配合幾個實例來大致說明一下
首先我們討論一個偏於理論的例子假設我們現在當前系統有兩個OSGI bundle再加入第三個陌生的bundle那這個新的bundle是不能被自動發現的(autodiscovered自己發明的~_~)除非在被顯示調用的情況下同比如果當前系統中有一個plugin其本身聲明了一個擴展點(host plugin)然後系統中引入了一個新的plugin按照host plugin定義的擴展契約提供了擴展(extesion plugin)那麼這個新的plugin是可以被自動發現的host plugin可以借助eclipse擴展注冊表查找對應的擴展而同時避免了兩個plugin之間的緊密耦合(說明有人以為extension plugin和host plugin之間是緊密耦合的我覺得更合適的說法是plugin是開發的)
我們知道Eclipse本身的體系架構是微內核(micro kernel)核心插件(core plugins)和用戶應用插件(application plugins)
上圖中的runtimeworkbench和resource就是Eclipse所謂的核心插件而JDT恰恰是在這些核心插件的基礎上提供擴展並做無縫集成同時也定義了一些擴展點供JDT自身或者其他擴展插件使用並做無縫集成
對普通Eclipse工具用戶而言如果沒有擴展點的機制用戶能夠方便的將第三方工具安裝(本質上是集成)到Eclipse中嗎?是不是要關心一些技術細節啊?
「總結」
上面一直在說Eclipse plugin在OSGI bundle的基礎上在追求開放和擴展其實從技術本質上講Eclipse是對OSGI協議在插件間的交互方式做了補充擴展和擴展點也成為了我們在Eclipse插件開發過程中最主要的插件間交互方式了而OSGI中定義的組件間松耦合交互方式(OSGI Service)卻並沒有很大的用武之地(對用戶而言)說到這裡可能會給大家造成一個疑問 Eclipse擴展點機制這麼好為什麼不加入OSGI協議呢?需求不同
最後再回顧一下Eclipse之所以提供了擴展點機制本質上取決於Eclipse自身的部分關鍵需求擴展和集成OSGI協議本身尤其應用場景Eclipse的擴展點機制是針對Eclipse自身需求在OSGI之上做的有力補充
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29149.html