RCP最靈活的模塊組織方式
文/陳剛 from www.ChenGang.com.cn at 2006年4月29日 (轉(zhuǎn)載請標(biāo)明出處)
起因是這樣的,有一個(gè)已經(jīng)開發(fā)了比較多功能的RCP程序,它包含這樣幾個(gè)模塊:JMX瀏覽器(類似于MC4J的功能)、系統(tǒng)事件監(jiān)控器、權(quán)限控制框架等。這些模塊是寫在一個(gè)RCP項(xiàng)目中的。
現(xiàn)在,我想更靈活些。比如,JMX瀏覽器模塊這個(gè)是通用的,但如果誰要使用這個(gè)功能,就必須運(yùn)行整個(gè)RCP項(xiàng)目才行,而我希望這個(gè)JMX模塊是可簡單裝卸的。充分運(yùn)行Eclipse的插件機(jī)制,讓各模塊成為一個(gè)獨(dú)立的插件,應(yīng)該可以實(shí)現(xiàn)這個(gè)功能。
比如,JMX模塊形成一個(gè)獨(dú)立的插件:它既可以讓其他人當(dāng)做一個(gè)普通插件,安裝到Eclipse中;也可以成為一個(gè)模塊,插入我RCP項(xiàng)目中來。這樣的設(shè)計(jì),讓模塊的開重用性變得很高了。
這個(gè)想法中,RCP部份,僅僅成為一個(gè)空殼,提供更插件的插入機(jī)制。這個(gè)方案特別適合那種想把原有插件項(xiàng)目,改裝成RCP而發(fā)布的項(xiàng)目,基本上原有插件無需做改動(dòng)。
然而這個(gè)想法是否可行呢?
(1) 插件能否想插入到Eclipse,插入到RCP空殼項(xiàng)目中?
(2) 插件中的如果存在依賴關(guān)系(比如,一個(gè)插件需要用到另一個(gè)插件的代碼),怎么實(shí)現(xiàn)。
(3) 插件依然的JAR包怎么處理。比如有三個(gè)插件都要用到log4j.jar來輸出日志,如果把log4j.jar放在插件項(xiàng)目的lib目錄來使用的話,log4j.jar在三個(gè)插件各有一份,就會(huì)有三份。當(dāng)三個(gè)插件合到RCP項(xiàng)目中時(shí),就有兩個(gè)log4j是冗余的。這會(huì)增在RCP項(xiàng)目的大小。
(4) RCP項(xiàng)目有一些界面元素須要根據(jù)插入的插件,做相應(yīng)的變化。怎么實(shí)現(xiàn)?
為了驗(yàn)證第(1)點(diǎn),我做了這個(gè)實(shí)驗(yàn):
創(chuàng)建一個(gè)很簡單的插件項(xiàng)目,此插件項(xiàng)目包含一個(gè)很簡單的透視圖。我要看看這個(gè)透視圖能否出現(xiàn)在RCP項(xiàng)目中的。很順便,當(dāng)我把插件項(xiàng)目導(dǎo)出后,安裝到RCP項(xiàng)目的plugin目錄,再運(yùn)行RCP項(xiàng)目,發(fā)現(xiàn)這個(gè)插件項(xiàng)目的透視圖出現(xiàn)在了RCP項(xiàng)目的透視圖列表中。
如果是開發(fā)時(shí),我希望運(yùn)行RCP項(xiàng)目時(shí),就能看到插件項(xiàng)目插入進(jìn)來后的效果。實(shí)現(xiàn)也不難,步驟如下:
(1) 在Plugin.xml的dependencies項(xiàng),把插件項(xiàng)目加入到Required Plug-ins中。(表示項(xiàng)目的依賴)
(2) 在run..里的Plug-ins項(xiàng),選擇插件項(xiàng)目和RCP項(xiàng)目,并單擊Add Required Plug-ins(表現(xiàn)運(yùn)行時(shí)的依賴)
為了驗(yàn)證第(2)點(diǎn),我做了這個(gè)實(shí)驗(yàn):
在插件項(xiàng)目中創(chuàng)建一個(gè)類,在RCP項(xiàng)目中使用這個(gè)類,這時(shí)還是找不到類的。解決辦法是:在打開插件項(xiàng)目的plugin.xml-->runtime選項(xiàng)卡-->Exported Packages(輸出的包),把這個(gè)類所在的包加入進(jìn)來。這下RCP項(xiàng)目可以使用插件項(xiàng)目的類了。
關(guān)于第(3)點(diǎn),我沒有做實(shí)驗(yàn),我的想法是:把jar包封裝成插件(可參考eclipse對junit的封裝),從而將項(xiàng)目對JAR包的依賴,轉(zhuǎn)變成對插件的依賴。
關(guān)于第(4)點(diǎn),我沒有做實(shí)驗(yàn),我的想法是:通過自定義RCP項(xiàng)目的擴(kuò)展點(diǎn)來實(shí)現(xiàn)。
在我這個(gè)項(xiàng)目分解模塊還會(huì)遇到這樣的問題:權(quán)限安全模塊是影響到整個(gè)RCP項(xiàng)目的,但JMX模塊獨(dú)立出來后,顯然不是必須要權(quán)限安全模塊的。怎么解除這種依賴關(guān)系呢。我看是解除不了的了,但可以設(shè)一個(gè)開關(guān),讓權(quán)限安全模塊失效。這樣雖然代碼和權(quán)限安全模塊有依賴,但可以把權(quán)限檢查的功能關(guān)閉。
總結(jié):
這種方式雖然靈活,但也是有代價(jià)的---編程和項(xiàng)目管理更復(fù)雜了。
起因是這樣的,有一個(gè)已經(jīng)開發(fā)了比較多功能的RCP程序,它包含這樣幾個(gè)模塊:JMX瀏覽器(類似于MC4J的功能)、系統(tǒng)事件監(jiān)控器、權(quán)限控制框架等。這些模塊是寫在一個(gè)RCP項(xiàng)目中的。
現(xiàn)在,我想更靈活些。比如,JMX瀏覽器模塊這個(gè)是通用的,但如果誰要使用這個(gè)功能,就必須運(yùn)行整個(gè)RCP項(xiàng)目才行,而我希望這個(gè)JMX模塊是可簡單裝卸的。充分運(yùn)行Eclipse的插件機(jī)制,讓各模塊成為一個(gè)獨(dú)立的插件,應(yīng)該可以實(shí)現(xiàn)這個(gè)功能。
比如,JMX模塊形成一個(gè)獨(dú)立的插件:它既可以讓其他人當(dāng)做一個(gè)普通插件,安裝到Eclipse中;也可以成為一個(gè)模塊,插入我RCP項(xiàng)目中來。這樣的設(shè)計(jì),讓模塊的開重用性變得很高了。
這個(gè)想法中,RCP部份,僅僅成為一個(gè)空殼,提供更插件的插入機(jī)制。這個(gè)方案特別適合那種想把原有插件項(xiàng)目,改裝成RCP而發(fā)布的項(xiàng)目,基本上原有插件無需做改動(dòng)。
然而這個(gè)想法是否可行呢?
(1) 插件能否想插入到Eclipse,插入到RCP空殼項(xiàng)目中?
(2) 插件中的如果存在依賴關(guān)系(比如,一個(gè)插件需要用到另一個(gè)插件的代碼),怎么實(shí)現(xiàn)。
(3) 插件依然的JAR包怎么處理。比如有三個(gè)插件都要用到log4j.jar來輸出日志,如果把log4j.jar放在插件項(xiàng)目的lib目錄來使用的話,log4j.jar在三個(gè)插件各有一份,就會(huì)有三份。當(dāng)三個(gè)插件合到RCP項(xiàng)目中時(shí),就有兩個(gè)log4j是冗余的。這會(huì)增在RCP項(xiàng)目的大小。
(4) RCP項(xiàng)目有一些界面元素須要根據(jù)插入的插件,做相應(yīng)的變化。怎么實(shí)現(xiàn)?
為了驗(yàn)證第(1)點(diǎn),我做了這個(gè)實(shí)驗(yàn):
創(chuàng)建一個(gè)很簡單的插件項(xiàng)目,此插件項(xiàng)目包含一個(gè)很簡單的透視圖。我要看看這個(gè)透視圖能否出現(xiàn)在RCP項(xiàng)目中的。很順便,當(dāng)我把插件項(xiàng)目導(dǎo)出后,安裝到RCP項(xiàng)目的plugin目錄,再運(yùn)行RCP項(xiàng)目,發(fā)現(xiàn)這個(gè)插件項(xiàng)目的透視圖出現(xiàn)在了RCP項(xiàng)目的透視圖列表中。
如果是開發(fā)時(shí),我希望運(yùn)行RCP項(xiàng)目時(shí),就能看到插件項(xiàng)目插入進(jìn)來后的效果。實(shí)現(xiàn)也不難,步驟如下:
(1) 在Plugin.xml的dependencies項(xiàng),把插件項(xiàng)目加入到Required Plug-ins中。(表示項(xiàng)目的依賴)
(2) 在run..里的Plug-ins項(xiàng),選擇插件項(xiàng)目和RCP項(xiàng)目,并單擊Add Required Plug-ins(表現(xiàn)運(yùn)行時(shí)的依賴)
為了驗(yàn)證第(2)點(diǎn),我做了這個(gè)實(shí)驗(yàn):
在插件項(xiàng)目中創(chuàng)建一個(gè)類,在RCP項(xiàng)目中使用這個(gè)類,這時(shí)還是找不到類的。解決辦法是:在打開插件項(xiàng)目的plugin.xml-->runtime選項(xiàng)卡-->Exported Packages(輸出的包),把這個(gè)類所在的包加入進(jìn)來。這下RCP項(xiàng)目可以使用插件項(xiàng)目的類了。
關(guān)于第(3)點(diǎn),我沒有做實(shí)驗(yàn),我的想法是:把jar包封裝成插件(可參考eclipse對junit的封裝),從而將項(xiàng)目對JAR包的依賴,轉(zhuǎn)變成對插件的依賴。
關(guān)于第(4)點(diǎn),我沒有做實(shí)驗(yàn),我的想法是:通過自定義RCP項(xiàng)目的擴(kuò)展點(diǎn)來實(shí)現(xiàn)。
在我這個(gè)項(xiàng)目分解模塊還會(huì)遇到這樣的問題:權(quán)限安全模塊是影響到整個(gè)RCP項(xiàng)目的,但JMX模塊獨(dú)立出來后,顯然不是必須要權(quán)限安全模塊的。怎么解除這種依賴關(guān)系呢。我看是解除不了的了,但可以設(shè)一個(gè)開關(guān),讓權(quán)限安全模塊失效。這樣雖然代碼和權(quán)限安全模塊有依賴,但可以把權(quán)限檢查的功能關(guān)閉。
總結(jié):
這種方式雖然靈活,但也是有代價(jià)的---編程和項(xiàng)目管理更復(fù)雜了。
posted on 2006-04-29 12:40 陳剛 閱讀(2536) 評論(10) 編輯 收藏 所屬分類: Eclipse