<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機(jī)制得以流行,當(dāng)然,Eclipse的優(yōu)勢(shì)不僅僅在此,但正因?yàn)椴捎昧薖lugin機(jī)制,Eclipse才得以被不斷的擴(kuò)充,越來越強(qiáng)大。一直以來就想分析Eclipse的Plugin Framework,由于各種原因一直耽擱,剛好這個(gè)周末沒什么事,下定決心對(duì)其進(jìn)行了研究和分析,方法很原始,就是對(duì)Eclipse的啟動(dòng)過程進(jìn)行分析,基于的是Eclipse 3.1的版本,分析過程就不在這說了,主要是說說分析出來的心得。
    架構(gòu)上來講Eclipse基本采用的是Kernel+Core Plugins+Custom Plugins的結(jié)構(gòu)體系,除了Kernel部分外均為Plugin,所以可稱為all are plugins,凡是Plugin的部分都是可被替換的。

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

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

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

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

    帶來的思考
    Eclipse Plugin Framework采用的是OSGI的實(shí)現(xiàn),一定程度上我們也能看到OSGI的優(yōu)點(diǎn),那么JMX+IoC方式的Plugin Framework與其的比較又是在哪些方面呢?Eclipse Plugin Framework不足的地方又在哪里呢?哪些地方值得改進(jìn)呢?

     

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

    評(píng)論

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

    你好!我最近在做Eclipse插件,對(duì)自定義插件的那部分非常頭疼,不知道應(yīng)該怎么設(shè)計(jì),怎么實(shí)現(xiàn)。你有例子或者資料能推薦給我嗎?
    謝謝!郵箱 hopeshared@tom.com  回復(fù)  更多評(píng)論   

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

    請(qǐng)參考Contributing to Eclipse的例子  回復(fù)  更多評(píng)論   

    # 請(qǐng)同仁指教,務(wù)必! 2005-09-12 16:07 李健

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

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

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

    在沒有使用osgi的時(shí)候就看過eclipse的部分源碼,對(duì)其機(jī)制深有感觸, 核心與osgi結(jié)合后 有更進(jìn)一步 尤其是對(duì)rcp應(yīng)用,可惜國內(nèi)軟件巨頭 似乎興趣不大,其實(shí)免費(fèi)午餐 也有好的  回復(fù)  更多評(píng)論   

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

    幾個(gè)月前就讀過,再次讀還是大受啟發(fā)。

    尤其最后“帶來的思考”更是我現(xiàn)在感到困惑的。JBoss會(huì)考慮把JMX換成osgi?  回復(fù)  更多評(píng)論   

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

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

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

    ^_^,那是因?yàn)樗且粋€(gè)擴(kuò)充了的eclipse的plugin機(jī)制  回復(fù)  更多評(píng)論   

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

    @BlueDavy
    我不認(rèn)為CDT是擴(kuò)充了的eclipse的plugin機(jī)制,CDT的原理也很簡單,也就是一個(gè)core+兩個(gè)基于core的擴(kuò)展plugin,層層遞進(jìn)。畢竟是那么多人做了幾年的心血,又是IBM主導(dǎo),不好也難!  回復(fù)  更多評(píng)論   

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

    ^_^,同意
    CDT必然是遵守eclipse的plugin機(jī)制.......我的意思是eclipse的plugin機(jī)制是有擴(kuò)展的,eclipse的plugin機(jī)制是基于OSGI的,但它基于它之上提出了一些提升plugin體系的改進(jìn)。  回復(fù)  更多評(píng)論   

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

    @BlueDavy
    呵呵,這點(diǎn)嚴(yán)重同意!  回復(fù)  更多評(píng)論   

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

    希望能出一篇文章講講分析過程。  回復(fù)  更多評(píng)論   

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

    @weidagang2046
    I am agree with u.  回復(fù)  更多評(píng)論   

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

    不錯(cuò)啊,也順便推薦一個(gè)eclipse插件站點(diǎn)。

    http://www.eclipsepowered.net/  回復(fù)  更多評(píng)論   

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

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

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

    牛啊 借鑒下可以不 嘻嘻  回復(fù)  更多評(píng)論   

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導(dǎo)航

    <2006年9月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    統(tǒng)計(jì)

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 免费羞羞视频网站| 三年在线观看免费观看完整版中文| www永久免费视频| 日本一区二区三区日本免费| 亚洲三级高清免费| 国产无人区码卡二卡三卡免费| 久久噜噜噜久久亚洲va久| 久久久WWW免费人成精品| 国产亚洲美日韩AV中文字幕无码成人 | 特级无码毛片免费视频尤物| 亚洲日韩小电影在线观看| 中文字幕免费在线观看动作大片| 7777久久亚洲中文字幕蜜桃| 国产在线a免费观看| 日韩精品无码永久免费网站| 中文字幕在线亚洲精品| 成全动漫视频在线观看免费高清版下载 | 亚洲AⅤ优女AV综合久久久| 免费的黄网站男人的天堂| 亚洲综合视频在线| 99re6热视频精品免费观看| 亚洲精品中文字幕无码AV| 一二三四视频在线观看中文版免费| 国产午夜亚洲精品| 亚洲色婷婷六月亚洲婷婷6月| 成熟女人牲交片免费观看视频| 噜噜综合亚洲AV中文无码| 亚洲国产午夜中文字幕精品黄网站| 国产黄色片免费看| 亚洲国产人成网站在线电影动漫 | 涩涩色中文综合亚洲| 久久精品国产亚洲香蕉| 国产成人yy免费视频| 亚洲人成色777777精品| 亚洲精品国产精品乱码不卡| 国产免费久久精品99re丫y| 久久九九全国免费| 亚洲国产精品成人综合色在线婷婷| 在线免费不卡视频| 精品一区二区三区免费视频 | 精品人妻系列无码人妻免费视频|