隨筆 - 3, 文章 - 152, 評(píng)論 - 17, 引用 - 0
          數(shù)據(jù)加載中……

          5.2 插件的Hello World

          *******************************************************
          作者:陳剛,普通程序員,曾有幸以Eclipse插件方式開發(fā)過一個(gè)中型軟件?,F(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)槟氵€沒有看到過Eclipse的插件是什么樣的。Eclipse可以全面更新你對(duì)插件的概念,它也是對(duì)插件概念運(yùn)用得最徹底最爐火純青的一個(gè)軟件。

          在第一章我們就介紹了Eclipse的技術(shù)特點(diǎn),Eclipse的內(nèi)核很小,其他功能都是基于這個(gè)內(nèi)核上的插件,如Eclipse自帶的UNITANT等。而且Eclipse還開放了自己的插件機(jī)制,并提供了很好的插件開發(fā)環(huán)境,讓用戶可以自己來開發(fā)Eclipse的插件。想知道開發(fā)Eclipse的插件能到什么程度嗎?看看這些Eclipse上的插件吧:用于UML建模的Together for Eclipse、用于JSPMyEclipseLomboz、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),讓盡量多的軟件做為插件集成在上面,成為未來的集成的桌面環(huán)境。同樣我們可以將我們的應(yīng)用系統(tǒng)寫成Eclipse插件,筆者就在2004年參與開發(fā)了一個(gè)項(xiàng)目管理軟件,該軟件就是以Eclipse的插件形式開發(fā)的。

          5.1.2  Eclipse插件開發(fā)的優(yōu)勢(shì)和不足

          那么將軟件寫成插件有什么好處呢?對(duì)于用戶來說Eclipse的使用環(huán)境比較友好,前面介紹的SWT/JFace中還是比較基本的界面元素,象Eclipse中的視圖、編輯窗、停泊窗這些界面如果實(shí)現(xiàn)呢?如果用Appliction的方式會(huì)很麻煩,如果寫成Eclipse插件則實(shí)現(xiàn)這些界面風(fēng)格不會(huì)吹灰之力。可以說把軟件開發(fā)成Eclipse插件的最大好處就是界面風(fēng)格友好統(tǒng)一,如果用戶較熟悉Eclipse超做的話這種優(yōu)勢(shì)就更明顯。

          當(dāng)然將軟件寫成插件形式也有一定的缺陷。首先插件必須依附Eclipse,如果要安裝插件就得先安裝Eclipse。其次,插件和Eclipse融合在一起,原Eclipse的一些菜單和工具欄是無法完全屏蔽的。

          5.2  插件的Hello World

          5.2.1  使用向?qū)б徊讲絼?chuàng)建HelloWorld

          我們利用Eclipse的“新建”向?qū)韯?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è)模板來創(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è)置信息來加載插件的。在插件加發(fā)初期會(huì)頻繁在這個(gè)文件中做編輯,術(shù)語叫“設(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.4Eclipse界面中部顯示的就是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)常要通過這個(gè)方法來試運(yùn)行所開發(fā)的插件項(xiàng)目,不過那時(shí)候選擇“運(yùn)行→調(diào)試方式→運(yùn)行工作平臺(tái)”以調(diào)試方式來運(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模板來新建一個(gè)空白的插件項(xiàng)目,然后一步步的經(jīng)過手工實(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ì)出很多庫引用的錯(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做了一些小修改:刪除了無用的注釋和構(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)說明

          如圖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">

          說明:<plugin>plugin.xml的主體。

          l           id 插件的唯一標(biāo)識(shí)。實(shí)際項(xiàng)目中一般加上包名或網(wǎng)址名來命名id,比如eclipsetomcat插件是這樣命名的: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>

          說明:這里是聲明插件運(yùn)行時(shí)需要的jar包,比如插件要連接MySQL數(shù)據(jù)庫需要它的一個(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>

          說明:在requires域中定義了該插件所要使用的依賴插件。現(xiàn)在兩項(xiàng)就夠了,隨著開發(fā)的不斷深入這里將會(huì)添加更多對(duì)其它插件的引用。如下是筆者的實(shí)際項(xiàng)目中的requires設(shè)置,它要用到draw2dgef插件來畫圖、用于插件的幫助系統(tǒng)來創(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="樣本菜單(&amp;M)"

                         id="sampleMenu">

                      <separator

                            name="sampleGroup">

                      </separator>

                   </menu>

                   <action

                         label="樣本操作(&amp;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>項(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ì)的說明,其位置為:選擇主菜單“幫助→幫助內(nèi)容”,然后打開“平臺(tái)插件開發(fā)指南→參考→擴(kuò)展點(diǎn)參考”項(xiàng)。

          5、運(yùn)行插件

          按上一節(jié)(5.2.1節(jié))所說的方法運(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)行效果圖

          posted on 2005-02-15 11:12 閱讀(317) 評(píng)論(0)  編輯  收藏 所屬分類: Edit Tools

          主站蜘蛛池模板: 饶河县| 全州县| 体育| 顺昌县| 阳山县| 琼海市| 和政县| 尼木县| 龙南县| 阿拉善右旗| 荣成市| 砀山县| 宜兰县| 兖州市| 武邑县| 十堰市| 冷水江市| 西乌珠穆沁旗| 永康市| 高淳县| 渝中区| 贵港市| 图们市| 烟台市| 河西区| 汕尾市| 墨脱县| 绵竹市| 宁晋县| 同德县| 措勤县| 潍坊市| 宽甸| 雷州市| 广灵县| 额济纳旗| 芮城县| 红原县| 新绛县| 富民县| 化德县|