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