<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture)

    概述
    Eclipse中最出彩的部分莫過于它的Plugin Framework,可以說Eclipse在一定程度上使得Plugin機制得以流行,當然,Eclipse的優勢不僅僅在此,但正因為采用了Plugin機制,Eclipse才得以被不斷的擴充,越來越強大。一直以來就想分析Eclipse的Plugin Framework,由于各種原因一直耽擱,剛好這個周末沒什么事,下定決心對其進行了研究和分析,方法很原始,就是對Eclipse的啟動過程進行分析,基于的是Eclipse 3.1的版本,分析過程就不在這說了,主要是說說分析出來的心得。
    架構上來講Eclipse基本采用的是Kernel+Core Plugins+Custom Plugins的結構體系,除了Kernel部分外均為Plugin,所以可稱為all are plugins,凡是Plugin的部分都是可被替換的。

    OSGI
    Eclipse 3.0后采用的是OSGI來作為其Plugin Architecture實現的依據,鑒于此就得簡單提提OSGI了,主要從Plugin的角度來分析OSGI,OSGI概念中主要分為了Bundle和Service,可以認為Bundle是一個模塊的管理器,主要是通過BundleActivator管理模塊的生命周期,而Service則是這個模塊可暴露對外的服務對象,這里體現了OSGI和傳統的Plugin Framework不同的一個地方,管理和靜態結構分開,在OSGI中通過在manifest.mf文件中增加一些內容來發布Bundle,在其中描述了Bundle的提供商、版本、唯一ID、classpath、暴露對外的包、所依賴的包;每個Bundle擁有自己的ClassLoader以及context,通過context可進行服務的注冊、卸載等,這些操作都會通過事件機制廣播給相應的其他的Bundle;一般來說都為通過在Bundle中編寫初始需要注冊的服務的方法來完成Bundle可供外部使用的服務的暴露功能;如需要調用其他Plugin提供的服務可通過context的getServiceReference先獲取Service的句柄,再通過context.getService(ServiceReference)的方法獲取Service的實體。

    Eclipse Plugin定義
    Eclipse中的Plugin的概念為包含一系列服務的模塊即為一個Plugin。既然是遵循OSGI的,也就意味著Plugin通常是由Bundle和N多Service共同構成的,在此基礎上Eclipse認為Plugin之間通常存在兩種關系,一種為依賴,一種為擴展,對于依賴可通過OSGI中元描述信息里添加需要引用的Plugin即可實現,但擴展在OSGI中是沒有定義的,Eclipse采用了一個Extension Point的方式來實現Plugin的擴展功能。
    結合OSGI
    Eclipse遵循OSGI對于Plugin的ID、版本、提供商、classpath、所依賴的plugin以及可暴露對外的包均在manifest.mf文件中定義。
    Plugin Extension Point
    對于擴展,Eclipse采用Extension Point的方式來實現,每個Plugin可定義自己的Extension Point,同時也可實現其他Plugin的Extension Point,由于這個在OSGI中是未定義的,在Eclipse中仍然通過在plugin.xml中進行描述,描述的方法為通過<extension-point id="" name="" schema="">的形式來定義Plugin的擴展點,通過<extension point="">的形式來定義實現的其他Plugin的擴展點,所提供的擴展點通過schema的方式進行描述,詳細見eclipse extension-point schema規范,為了更好的說明擴展點這個概念,舉例如下,如工具欄就是工具欄Plugin提供的一個擴展點,其他的Plugin可通過此擴展點添加按鈕至工具欄中,并可相應的添加按鈕所對應的事件(當然,此事件必須實現工具欄Plugin此擴展點所要求的接口),工具欄的Plugin將通過callback的方式來相應的響應按鈕的動作。可見通過Extension Point的方式可以很好的提供Plugin的擴展方式以及實現擴展的方式。

    Eclipse Plugin Framework
    那么Eclipse是如何做到Plugin機制的實現的呢??還是先講講Eclipse的設計風格,Eclipse在設計時有個重要的分層法則,即語言層相關和語言層無關的代碼分開(如jdt.core和core),核心與UI分開(如workbench.ui和workbench.core)這兩個分層法則,這個在Eclipse代碼中處處可見,在Plugin Framework部分也充分得體現了這個,遵循OSGI,Eclipse首先是實現了一個OSGI Impl,這個主要通過它的FrameWork、BundleHost、ServiceRegistry、BundleContextImpl等對象來實現,如果關心的話大家可以看看這部分的代碼,實現了Bundle的安裝、觸發、卸載以及Service的注冊、卸載、調用,在Plugin機制上Eclipse采用的為lazy load的方式,即在調用時才進行實際的啟動,采用的為句柄/實體的方式來實現,外部則通過OSGI進行啟動、停止等動作,各Plugin則通過BundleContext來進行服務的注冊、卸載和調用,這是OSGI的部分實現的簡單介紹。
    那么Extension Point方面Eclipse是如何實現的呢,在加載Plugin時,Eclipse通過對plugin.xml的解析獲取其中的<extension-point>節點和<extension>節點,并相應的注冊到ExtensionRegistry中,而各個提供擴展點的Plugin在提供擴展點的地方進行處理,如工具欄Plugin提供了工具欄的擴展點,那么在構成工具欄時Plugin將通過Platform.getPluginRegistry().getExtensionPoint(擴展點ID)的方法獲取所有實現此擴展點的集合IExtensionPoint[],通過此集合可獲取IConfigurationElement[],而通過這個就可以獲取<extension point="">其中的配置,同時還可通過IConfigurationElement創建回調對象的實例,通過這樣的方法Eclipse也就實現了對于Plugin的擴展以及擴展的功能的回調。在Plugin Framework中還涉及很多事件機制的使用,比如Framework的事件機制,以便在Bundle注冊、Service注冊的時候進行通知。

    總結
    通過對Eclipse啟動過程的分析,可清晰的看到Eclipse Kernel+Core Plugins+Application Plugins的方式,在代碼中分別對應為loadBasicBundles和registerApplicationServices,loadBasicBundles通過加載config.ini中的osgi.bundles完成基本的bundles的加載,去看看這個配置會發現是org.eclipse.core.runtime還有一個update,core.runtime又會通過IDEApplication來完成整個Eclipse的啟動,同時會注冊所有與workbench相關的plugin。
    Eclipse由于以前版本的Plugin Framework是沒有采用OSGI的,所以通過EclipseAdaptor的方式來實現與以往的兼容,目前新的Plugin采用的方式基本就是manifest.mf描述Plugin OSGI部分的信息,Plugin.xml描述擴展點的信息。
    Eclipse中有非常多優秀的設計,這個在看它的代碼時會有很深的感觸,比如Contributing to Eclipse中提到的Extension Object/Interface的設計,確實是非常的不錯,雖然看到你可能覺得很簡單,關鍵是要想得到并合適的去使用。
    總結陳詞,^_^,Eclipse Plugin Framework是采用OSGI Impl+Plugin Extension-Point的方式來共同實現的,實現了Plugin的部署、編寫、獨立的Classloader和Context、Plugin中Service的注冊、Plugin中Service的調用、Plugin的依賴、Plugin的擴展、Plugin生命周期的管理。

    帶來的思考
    Eclipse Plugin Framework采用的是OSGI的實現,一定程度上我們也能看到OSGI的優點,那么JMX+IoC方式的Plugin Framework與其的比較又是在哪些方面呢?Eclipse Plugin Framework不足的地方又在哪里呢?哪些地方值得改進呢?

     

    posted on 2005-07-03 21:57 BlueDavy 閱讀(9771) 評論(15)  編輯  收藏 所屬分類: Plugin Architecture

    評論

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2005-08-10 16:00 hopeshared

    你好!我最近在做Eclipse插件,對自定義插件的那部分非常頭疼,不知道應該怎么設計,怎么實現。你有例子或者資料能推薦給我嗎?
    謝謝!郵箱 hopeshared@tom.com  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2005-08-10 19:33 Programmer's Life

    請參考Contributing to Eclipse的例子  回復  更多評論   

    # 請同仁指教,務必! 2005-09-12 16:07 李健

    我看contributing to eclipse 在完成第一循環的時候,總是有問題,找不到
    <action
    label="Run Test"
    class="org.eclipse.contribution.junit.RunTestAction"
    enablesFor="1"
    id="org.eclipse.contribution.junit.runtest.action">

    里面的那個類,如果我將
    <plugin
    id="org.eclipse.contribution.junit"
    name="JUnit Plug-in"
    version="1.0.0"
    provider-name=""
    class="org.eclipse.contribution.junit.JUnitPlugin">
    這段中的class一行去掉就可以找到,(當然報錯)  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2005-09-29 17:16 solouton@hotmail.com

    在沒有使用osgi的時候就看過eclipse的部分源碼,對其機制深有感觸, 核心與osgi結合后 有更進一步 尤其是對rcp應用,可惜國內軟件巨頭 似乎興趣不大,其實免費午餐 也有好的  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2005-12-15 17:30 weide

    幾個月前就讀過,再次讀還是大受啟發。

    尤其最后“帶來的思考”更是我現在感到困惑的。JBoss會考慮把JMX換成osgi?  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-15 16:41 ezysky

    感覺還有進行了研究,不過,eclipse的plug-in原理容易理解。不過讓我寫eclipse本身,感覺還是太困難了;而寫一個完整的plugin同樣還是不易,比如CDT就有近20萬行的代碼,并且感覺CDT把plugin復雜化了。  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-15 20:12 BlueDavy

    ^_^,那是因為它是一個擴充了的eclipse的plugin機制  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-16 10:38 ezysky

    @BlueDavy
    我不認為CDT是擴充了的eclipse的plugin機制,CDT的原理也很簡單,也就是一個core+兩個基于core的擴展plugin,層層遞進。畢竟是那么多人做了幾年的心血,又是IBM主導,不好也難!  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-16 10:43 BlueDavy

    ^_^,同意
    CDT必然是遵守eclipse的plugin機制.......我的意思是eclipse的plugin機制是有擴展的,eclipse的plugin機制是基于OSGI的,但它基于它之上提出了一些提升plugin體系的改進。  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-16 11:02 ezysky

    @BlueDavy
    呵呵,這點嚴重同意!  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-09-07 17:41 weidagang2046

    希望能出一篇文章講講分析過程。  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-09-28 11:51 jackgogogo

    @weidagang2046
    I am agree with u.  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-10-29 22:09 eclipsefan

    不錯啊,也順便推薦一個eclipse插件站點。

    http://www.eclipsepowered.net/  回復  更多評論   

    # 請教怎樣看Eclipse 的Plugin部分的源碼 2007-05-26 23:53 XGANG

    您好,我最近想看看Eclipse 的Plugin部分的源碼,但不知該怎么去看,比如從哪一個地方開始,怎么單步執行等還不了解,希望您能教教我。您在文章中說就是就是“對Eclipse的啟動過程進行分析”,我想請教一下怎么才能跟蹤啟動過程。謝謝了  回復  更多評論   

    # re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2010-03-13 13:09 cool

    牛啊 借鑒下可以不 嘻嘻  回復  更多評論   

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導航

    <2005年7月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統計

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 高清永久免费观看| 抽搐一进一出gif免费视频| 国产精品99久久免费观看| 国产成人亚洲综合色影视| 色www永久免费| 亚洲av福利无码无一区二区| 久久免费福利视频| 久久精品国产亚洲AV嫖农村妇女| 一级毛片免费观看| 亚洲国产精品综合一区在线| 真人做人试看60分钟免费视频| 亚洲人成网网址在线看| 午夜免费福利网站| 免费的黄色的网站| 亚洲人精品午夜射精日韩 | 亚洲国产综合专区在线电影| 久久免费精彩视频| 亚洲精品人成网在线播放影院| 日韩精品视频免费观看| 羞羞视频在线观看免费| 亚洲日韩精品无码一区二区三区| 久久精品私人影院免费看| 亚洲91精品麻豆国产系列在线| 青青青国产免费一夜七次郎| 特黄特色的大片观看免费视频| 亚洲精品国产品国语在线| 四虎在线最新永久免费| 亚洲成AV人影片在线观看| 狠狠色婷婷狠狠狠亚洲综合| 最近免费字幕中文大全视频| 亚洲av无码专区首页| 国产亚洲大尺度无码无码专线| 亚洲免费观看网站| 免费一区二区三区在线视频| 亚洲AV无码乱码国产麻豆 | 亚洲AV无码一区二三区| 免费在线观影网站| 亚洲乱亚洲乱妇无码| 国产精品亚洲成在人线| 在线免费观看色片| 久久免费动漫品精老司机|