*******************************************************
作者:陳剛,普通程序員,曾有幸以Eclipse插件方式開發(fā)過(guò)一個(gè)中型軟件。現(xiàn)將所學(xué)
付諸于紙,暫取書名<Eclipse插件開發(fā)指南>,將于2005年初由清華大學(xué)出版社出版。
blog:http://www.cnblogs.com/glchengang/
*******************************************************
5.1.1 Eclipse插件開發(fā)簡(jiǎn)介
插件的概念讀者應(yīng)該很熟悉,象MP3播放軟件WINAMP的皮膚插件、Windows Media Player的眾多的外觀插件、音效插件等等。但如果你以為插件只能做成為原軟件的邊角料,那是可以理解的,因?yàn)槟氵€沒有看到過(guò)Eclipse的插件是什么樣的。Eclipse可以全面更新你對(duì)插件的概念,它也是對(duì)插件概念運(yùn)用得最徹底最爐火純青的一個(gè)軟件。
在第一章我們就介紹了Eclipse的技術(shù)特點(diǎn),Eclipse的內(nèi)核很小,其他功能都是基于這個(gè)內(nèi)核上的插件,如Eclipse自帶的UNIT、ANT等。而且Eclipse還開放了自己的插件機(jī)制,并提供了很好的插件開發(fā)環(huán)境,讓用戶可以自己來(lái)開發(fā)Eclipse的插件。想知道開發(fā)Eclipse的插件能到什么程度嗎?看看這些Eclipse上的插件吧:用于UML建模的Together for Eclipse、用于JSP的MyEclipse和Lomboz、IBM的全能開發(fā)工具WSAD等等,它們?nèi)?/SPAN>Eclipse的插件。如果微軟愿意,也可以把Office軟件做成Eclipse的插件。如果Adobe有興趣,Photoshop也可以有for Eclipse的插件版,Eclipse中的API Draw2D的繪圖功能也是很功的。
Eclipse的各式插件正如雨后春筍般不斷冒出,Eclipse已經(jīng)超越了開發(fā)環(huán)境的概念,它的目標(biāo)是做成一個(gè)通用的平臺(tái),讓盡量多的軟件做為插件集成在上面,成為未來(lái)的集成的桌面環(huán)境。同樣我們可以將我們的應(yīng)用系統(tǒng)寫成Eclipse插件,筆者就在2004年參與開發(fā)了一個(gè)項(xiàng)目管理軟件,該軟件就是以Eclipse的插件形式開發(fā)的。
5.1.2 Eclipse插件開發(fā)的優(yōu)勢(shì)和不足
那么將軟件寫成插件有什么好處呢?對(duì)于用戶來(lái)說(shuō)Eclipse的使用環(huán)境比較友好,前面介紹的SWT/JFace中還是比較基本的界面元素,象Eclipse中的視圖、編輯窗、停泊窗這些界面如果實(shí)現(xiàn)呢?如果用Appliction的方式會(huì)很麻煩,如果寫成Eclipse插件則實(shí)現(xiàn)這些界面風(fēng)格不會(huì)吹灰之力。可以說(shuō)把軟件開發(fā)成Eclipse插件的最大好處就是界面風(fēng)格友好統(tǒng)一,如果用戶較熟悉Eclipse超做的話這種優(yōu)勢(shì)就更明顯。
當(dāng)然將軟件寫成插件形式也有一定的缺陷。首先插件必須依附Eclipse,如果要安裝插件就得先安裝Eclipse。其次,插件和Eclipse融合在一起,原Eclipse的一些菜單和工具欄是無(wú)法完全屏蔽的。
5.2 插件的Hello World
5.2.1 使用向?qū)б徊讲絼?chuàng)建HelloWorld
我們利用Eclipse的“新建”向?qū)?lái)創(chuàng)建一個(gè)簡(jiǎn)單的插件。
1、新建一個(gè)插件項(xiàng)目
(1)選擇主菜單“文件→新建→項(xiàng)目”,在彈出的窗口中(如圖5.1所示)選擇“插件開發(fā)”下的“插件項(xiàng)目”,然后單擊“下一步”。
圖5.1 項(xiàng)目類型選擇
(2)如圖5.2所示,輸入項(xiàng)目名“myplugin”,其他設(shè)置不變,然后單擊“下一步”。
圖5.2 項(xiàng)目名稱
(3)在新顯示的窗口中接受所有缺省值不變,直接單擊“下一步”,這時(shí)將顯示模板選擇窗口(如圖5.3所示)。勾選“使用其中一個(gè)模板來(lái)創(chuàng)建插件”項(xiàng),然后選擇模板“Hello,World”項(xiàng)。最后單擊“完成”結(jié)束向?qū)?duì)話框。
圖5.3 模板選擇窗口
2、插件項(xiàng)目myplugin簡(jiǎn)介
如果在新建項(xiàng)目中操作正確,Eclipse將顯示如圖5.4所示界面。
圖5.4 建立一個(gè)插件項(xiàng)目后的Eclipse界面
界面的左邊視圖中多了一個(gè)名為“myplugin”的項(xiàng)目。項(xiàng)目中有兩個(gè)文件:MypluginPlugin.java、SampleAction.java。MypluginPlugin.java較重要,今后將會(huì)使用到它,而SampleAction.java則是一個(gè)類似JFace中的Action,可以把它看做是插件中的Action,等會(huì)運(yùn)行時(shí)我們將看到SampleAction.java的效果。
項(xiàng)目根目錄下還有一個(gè)非常重要文件的plugin.xml,這個(gè)文件是插件的入口文件,Eclipse是根據(jù)這個(gè)文件里的設(shè)置信息來(lái)加載插件的。在插件加發(fā)初期會(huì)頻繁在這個(gè)文件中做編輯,術(shù)語(yǔ)叫“設(shè)置擴(kuò)展點(diǎn)”。象在Eclipse的增加主菜單、視圖、按鈕等,都是在這個(gè)文件里面設(shè)置不同的擴(kuò)展點(diǎn),后面的將詳細(xì)講到如何編輯此文件。有人會(huì)問:開發(fā)一個(gè)系統(tǒng)會(huì)有很多的菜單和按鈕,是不是都要在這個(gè)文件里設(shè)置呢?回答:不必。在plugin.xml里只設(shè)置和Eclipse接壤的主要擴(kuò)展點(diǎn),其他軟件自有的菜單和按鈕不用在plugin.xml設(shè)置了。圖5.4的Eclipse界面中部顯示的就是plugin.xml的設(shè)置窗口,單擊該窗口下部的plugin.xml項(xiàng)后(如圖5.5所示),就可以直接編輯此文件。
圖5.5 plugin.xml編輯窗下部的選項(xiàng)條
3、運(yùn)行插件
如圖5.6所示,選擇主菜單“運(yùn)行→運(yùn)行方式→運(yùn)行工作平臺(tái)”,這種是專用是插件的運(yùn)行方式,它將打開一個(gè)新的Eclipse環(huán)境,并同時(shí)將插件項(xiàng)目編譯加載到新的Eclipse環(huán)境中。今后開發(fā)經(jīng)常要通過(guò)這個(gè)方法來(lái)試運(yùn)行所開發(fā)的插件項(xiàng)目,不過(guò)那時(shí)候選擇“運(yùn)行→調(diào)試方式→運(yùn)行工作平臺(tái)”以調(diào)試方式來(lái)運(yùn)行插件會(huì)比較多,Eclipse支持調(diào)試期間的熱修改,不用每次修改都新啟一個(gè)Eclipse,這樣能節(jié)省很多調(diào)試開發(fā)時(shí)間。
新開的Eclipse界面如圖5.6所示,在新的Eclipse環(huán)境中新增加了一個(gè)工具欄按鈕和一個(gè)主菜單項(xiàng)。單擊此按鈕或菜單項(xiàng),將彈出一個(gè)“Hello,Eclipse world”信息提示框。
圖5.6 myplugin插件運(yùn)行效果圖
4、總結(jié)
本節(jié)里我們還只是依樣畫葫蘆,感覺有點(diǎn)云里霧里的吧。但不管怎么樣,第一個(gè)Eclipse插件已經(jīng)在我們手里誕生了,下一節(jié)我們將不用HelloWorld模板來(lái)新建一個(gè)空白的插件項(xiàng)目,然后一步步的經(jīng)過(guò)手工實(shí)現(xiàn)這個(gè)Hello World插件項(xiàng)目所擁有的功能。
5.2.2 以空白項(xiàng)目為基礎(chǔ)手工創(chuàng)建HelloWorld
1、新建項(xiàng)目
按照上一節(jié)所講新建插件項(xiàng)目的方法,新建一個(gè)名為myplugin2的插件項(xiàng)目。注意在最后一步不要選擇任何模板,直接單擊“完成”結(jié)束向?qū)?duì)話框,除此之外的其他步驟都一樣。很幸運(yùn),Eclipse3.0修正了很多BUG,象以前用Eclipse2.X中文版時(shí),在這一步還會(huì)出很多庫(kù)引用的錯(cuò)誤,要很麻煩的一個(gè)個(gè)去修正。
2、創(chuàng)建IWorkbenchWindowActionDelegate接口的實(shí)現(xiàn)類
新建一個(gè)包book.chapter_5,并將上一節(jié)中由HelloWorld模板生成的myplugin項(xiàng)目中的SampleAction.java文件復(fù)制到本項(xiàng)目中(Eclipse支持鼠標(biāo)拖拉操做)。然后對(duì)SampleAction做了一些小修改:刪除了無(wú)用的注釋和構(gòu)造函數(shù),修改了一下彈出框的提示文字,修改后的代碼如下:
/**
* 本類相當(dāng)于插件的Action,要在Eclipse中增加主菜單或工具欄按鈕,
* 就需要寫一個(gè)實(shí)現(xiàn)IWorkbenchWindowActionDelegate接口的類
*/
public class SampleAction implements IWorkbenchWindowActionDelegate {
private IWorkbenchWindow window;
public void run(IAction action) {
//打開一個(gè)信息提示框
MessageDialog.openInformation(window.getShell(),
"Myplugin2插件", "Hello,這是手工做的插件");
}
public void selectionChanged(IAction action, ISelection selection) {}
public void dispose() {}
public void init(IWorkbenchWindow window) {this.window = window;}
}
3、原plugin.xml文件各設(shè)置項(xiàng)說(shuō)明
如圖5.7所示,將plugin.xml文件打開,并單擊窗口下的“plugin.xml”項(xiàng)轉(zhuǎn)到其代碼編輯窗。
圖5.7 plugin.xml的代碼編輯窗
項(xiàng)詳細(xì)介紹其中的各項(xiàng)設(shè)置如下:
(1)<plugin>項(xiàng)
<plugin
id="myplugin2"
name="Myplugin2 插件"
version="1.0.0"
provider-name=""
class="myplugin2.Myplugin2Plugin">
說(shuō)明:<plugin>是plugin.xml的主體。
l id - 插件的唯一標(biāo)識(shí)。實(shí)際項(xiàng)目中一般加上包名或網(wǎng)址名來(lái)命名id,比如eclipse的tomcat插件是這樣命名的:org.eclipse.tomcat,這樣在世界上就不會(huì)有插件的標(biāo)識(shí)名和你重名了。以后在某些擴(kuò)展點(diǎn)中的屬性也會(huì)用到標(biāo)識(shí)符作為名稱的前綴。
l name - 插件的名稱,可以不唯一。
l version - 插件版本號(hào)。
l provider-name - 插件開發(fā)商的名稱,可以寫上作者或公司的名稱。
l class - 插件類的名稱,即插件項(xiàng)目自動(dòng)生成的MypluginPlugin2.java文件的類,前面加上包名。
(2)< runtime>項(xiàng)
<runtime>
<library name="myplugin2.jar">
<export name="*"/>
</library>
</runtime>
說(shuō)明:這里是聲明插件運(yùn)行時(shí)需要的jar包,比如插件要連接MySQL數(shù)據(jù)庫(kù)需要它的一個(gè)包,如下定義,其中“lib\”是該包所在路徑。其中本插件自身的jar包也要聲明,而且本插件在打包時(shí)將以myplugin2.jar為名打包。
<runtime>
<library name="myplugin2.jar">
<export name="*"/>
</library>
<library name="lib\mysql-connector-java-3.0.9-stable-bin.jar"/>
</runtime>
(3)<requires>項(xiàng)
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
</requires>
說(shuō)明:在requires域中定義了該插件所要使用的依賴插件。現(xiàn)在兩項(xiàng)就夠了,隨著開發(fā)的不斷深入這里將會(huì)添加更多對(duì)其它插件的引用。如下是筆者的實(shí)際項(xiàng)目中的requires設(shè)置,它要用到draw2d和gef插件來(lái)畫圖、用于插件的幫助系統(tǒng)來(lái)創(chuàng)建建自己的幫助文檔。
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.draw2d"/>
<import plugin="org.eclipse.gef"/>
<import plugin="org.eclipse.help"/>
<import plugin="org.eclipse.help.ui"/>
<import plugin="org.eclipse.help.appserver"/>
<import plugin="org.eclipse.help.webapp"/>
</requires>
4、為HelloWorld修改plugin.xml
將如下代碼加入到plugin.xml的“</requires>”行之后:
<extension point="org.eclipse.ui.actionSets">
<actionSet
label="樣本操作集"
visible="true"
id="myplugin2.actionSet">
<menu
label="樣本菜單(&M)"
id="sampleMenu">
<separator
name="sampleGroup">
</separator>
</menu>
<action
label="樣本操作(&S)"
icon="icons/sample.gif"
class="book.chapter_5.SampleAction"
tooltip="Hello,這是手工做的插件"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup"
id="book.chapter_5.SampleAction">
</action>
</actionSet>
</extension>
說(shuō)明:
在<extension>項(xiàng)設(shè)置要擴(kuò)展的擴(kuò)展點(diǎn),它是非常重要的一項(xiàng)。
l point="org.eclipse.ui.actionSets",設(shè)置了本插件的擴(kuò)展點(diǎn)為何,actionSets是指Eclipse的菜單、菜單項(xiàng)和工具欄按鈕的擴(kuò)展點(diǎn)
l <actionSet>項(xiàng)表示一個(gè)action組(菜單、按鈕)。label是顯示的名稱。id其唯一標(biāo)識(shí)符,只要保證在本plugin.xml文件中不存在重復(fù)的id就行了。visible指設(shè)置的按鈕或菜單是否顯示,如果設(shè)置成false,則不顯示。注意:要看visible設(shè)置的效果要將“透視圖”關(guān)掉再重新打開。
l <menu>是<actionSet>下的子項(xiàng),它表示在Eclipse中插入顯示一個(gè)名為“樣本菜單(M)”的主菜單。separator標(biāo)簽是一個(gè)結(jié)束符,它可以對(duì)菜單分組。
l <action>也是<actionSet>下的子項(xiàng),由它設(shè)置菜單、按鈕。icon是圖片的路徑,如果該圖片不存,默認(rèn)是一個(gè)紅色實(shí)心小框(Eclipse2.X)或不顯示圖片而顯示文字(Eclipse3.X)。Class是按鈕所對(duì)應(yīng)的類,注意包名也要加上。menubarPath表示把這個(gè)action做成一個(gè)菜單項(xiàng)放在上前<menu>定義的主菜單下。toolbarPath表示把這個(gè)action再做成一個(gè)工具欄按鈕。id是標(biāo)識(shí)符,設(shè)置成和class項(xiàng)一樣的名稱是個(gè)不錯(cuò)的選擇。
以上僅是Eclipse的擴(kuò)展點(diǎn)中的一種,此外還有其它的擴(kuò)展點(diǎn)共有一百多種之多。我們沒有必要了解所有擴(kuò)展點(diǎn)的設(shè)置,只須熟悉一些常用的擴(kuò)展點(diǎn)即可,如視圖的擴(kuò)展點(diǎn)org.eclipse.ui.views、編輯器的擴(kuò)展點(diǎn)org.eclipse.ui.editors等,本書將陸續(xù)給于介紹。另外,各種擴(kuò)展點(diǎn)在Eclipse的幫助中有詳細(xì)的說(shuō)明,其位置為:選擇主菜單“幫助→幫助內(nèi)容”,然后打開“平臺(tái)插件開發(fā)指南→參考→擴(kuò)展點(diǎn)參考”項(xiàng)。
5、運(yùn)行插件
按上一節(jié)(5.2.1節(jié))所說(shuō)的方法運(yùn)行插件(運(yùn)行之前不妨將上節(jié)所建的myplugin項(xiàng)目關(guān)閉掉,關(guān)閉方法:右鍵單擊myplugin項(xiàng)目名,然后在彈出菜單中選擇“關(guān)閉項(xiàng)目”)。myplugin2插件的效果如圖5.8所示
圖5.8 myplugin2插件運(yùn)行效果圖