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