2001 年11 月 IBM 宣布捐出了價值 4 千萬美金的開發軟件給開放源碼的 Eclipse 項目。如此受青睐的 Eclipse 是什麼樣子呢,如何使用呢?本文的第一部分會使你對Eclipse有一個初步的認識。並且,Eclipse這個號稱未來能進行任何語言開發的IDE集大成者,又將如何實現它的這一宏偉目標?第二部分介紹的Eclipse的插件開發將是其中的關鍵所在。
Eclipse 是替代IBM Visual Age for Java(以下簡稱IVJ)的下一代IDE開發環境,但它未來的目標不僅僅是成為專門開發Java程序的IDE環境,根據Eclipse的體系結構,通過開發插件,它能擴展到任何語言的開發,甚至能成為圖片繪制的工具。目前,Eclipse已經開始提供C語言開發的功能插件。更難能可貴的是, Eclipse是一個開放源代碼的項目,任何人都可以下載Eclipse的源代碼,並且在此基礎上開發自己的功能插件。也就是說未來只要有人需要,就會有建立在Eclipse之上的COBOL,Perl,Python等語言的開發插件出現。同時可以通過開發新的插件擴展現有插件的功能,比如在現有的 Java開發環境中加入Tomcat服務器插件。可以無限擴展,而且有著統一的外觀,操作和系統資源管理,這也正是Eclipse的潛力所在。
雖然目前Eclipse項目還沒有最後完成,但從已有的版本中已經能領略到Eclipse設計主導思想和主要功能特點。現在就了解Eclipse不但能使廣大程序員對這款業界期望很高的IDE能一睹為快,更為重要的是如果能參加到Eclipse項目的開發中或是閱讀它的開放源代碼,這對廣大程序員來說無疑是一個千載難逢的提高編程水平的好機會。Eclipse計劃提供多個平台的版本,象Windows,Linux,Solaris,HP-UX和 AIX,以下只介紹Windows版本。本文第一部分先介紹Eclipse的基本使用方法。第二部分介紹如何進行Eclipse的插件開發。
一.Eclipse簡介
Eclipse是開放源代碼的項目,你可以到www.eclipse.org去免費下載Eclipse的最新版本,一般Eclipse提供幾個下載版本:Release,Stable Build,Integration Build和Nightly Build,建議下載Release或Stable版本,筆者用的是Build20020125(Stable版本)。Eclipse本身是用Java語言編寫,但下載的壓縮包中並不包含Java運行環境,需要用戶自己另行安裝JRE,並且要在操作系統的環境變量中指明JRE中bin的路徑。安裝 Eclipse的步驟非常簡單:只需將下載的壓縮包按原路徑直接解壓既可。需注意如果有了更新的版本,要先刪除老的版本重新安裝,不能直接解壓到原來的路徑覆蓋老版本。在解壓縮之後可以到相應的安裝路徑去找Eclipse.exe運行。如果下載的是Release或Stable版本,並且JRE環境安裝正確無誤,一般來說不會有什麼問題,在閃現一個很酷的月蝕圖片後,Eclipse會顯示它的缺省界面:
[myimg]upload/eclipse1.png[/myimg]
乍一看起來,Eclipse的界面有點象JBilder,但實際操作進程中會發現它更象IVJ,畢竟開發Eclipse的主導用量是開發IVJ的原班人馬(可參考www.oti.com)。另外還值得一提的是Eclipse項目的參預者除了IBM以外,還有象Borland,Rational Software,RedHat,Merant等一大批業界的姣姣者,這也為Eclipse的未來奠定了良好的基礎。
下面將分別對Eclipse的各種特性作簡單介紹,包括:文件存放,開發環境,編譯與運行,版本管理,使用插件。
1. 文件存放
大多IVJ的初學者都對找不到Java源代碼感到非常不適應,因為IVJ把所有的源代碼都存儲到一個reponsitory庫文件中,想要得到文本格式的源代碼必須用 EXPort功能從reponsitory中導出源代碼。使用了reponsitory的IVJ對源代碼的管理功能幾乎達到極致,正是這一點使得許多程序員對IVJ鐘愛有加。而Eclipse將源代碼以文本方式保存,卻實現了IVJ對源代碼管理的幾乎全部功能,並且還增加了一些新的功能,能達到這一點,不能不驚歎於Eclipse開發者的高超技巧。
安裝Eclipse之後,在安裝路徑的下一層路徑中會有一個workspace文件夾。每當在Eclipse中新生成一個項目,缺省情況下都會在 workspace中產生和項目同名的文件夾以存放該項目所用到的全部文件。你可以用Windows資源管理器直接訪問或維護這些文件。
將已有的文件加入到一個項目中目前有三種方式:第一種是象在IVJ中的一樣,用IDE的"File"菜單中的"Import"功能將文件導入到項目中。這也是推薦的方式。第二種是從Windows的資源管理器中直接拖動文件到項目中。第三種就是直接將文件拷貝到項目文件夾中,然後在Eclipse的資源浏覽窗口中選擇項目或文件夾並執行從本地刷新功能(Refresh from locate)。需要說明的一點是,項目文件夾可以放在計算機的任何位置,並且可以在Eclipse中用新建項目的方法將項目路徑指定到已經存在的項目文件夾,然後在Eclipse中刷新即可。但要注意的是,任何項目文件夾建立或指定,目前都只能在Eclipse中用新建項目的方法來實現,即使是在缺省存儲項目文件夾的workspace路徑下新建立一個文件夾,在Eclipse環境中也是無法將它變成一個項目,也就是說,這個文件夾對Eclipse是不可視的。
2. Eclipse開發環境
和IVJ一樣,Eclipse開發環境被稱為Workbench,它主要由三個部分組成:視圖(Perspective),編輯窗口(Editor)和觀察窗口(View)。在下面的介紹中,希望讀者能知道Java視圖,Java包浏覽窗口,資源視圖,資源浏覽窗口等區別(其實最主要的也就是要區別視圖和窗口),以免在進一步的閱讀中產生混淆。圖二是它們之間的關系結構略圖:
[myimg]upload/eclipse2.png[/myimg]
圖二
在圖二中,可以看出Workbench包含多個視圖,而每個視圖又包含不同的窗口。由於每個編輯窗口有很大的共性,而且缺省情況它們都在同一區域中顯示,因此我們只在每個視圖中標出一個編輯窗口,以綠色表示。觀察窗口則各不相同,這裡以紅色表示。
下面首先介紹編輯窗口。所有文件的顯示和編輯都包含在編輯窗口裡。缺省情況下打開的多個文件是以標簽(TagTable)方式在同一個窗口中排列,可以用拖動方式將這些文件排列成各種布局。方法是拖動某一個文件的標簽(tag)到編輯窗口的邊框,當光標有相應的變化時再釋放。
當文件被加入到項目中後,在資源浏覽或Java包浏覽窗口雙擊文件,Eclipse會試圖打開這個文件:其中Eclipse內嵌的編輯器能缺省打開一些文件,如*.java,*.txt,*.class等等。如果是其它類型的文件,Eclipse會調用操作系統相應的缺省編輯器打開,如Word文檔,PDF文件等。同時Eclipse也可以象IVJ一樣用指定的編輯器打開相應的文件。例如在Eclipse項目中雙擊Html文件時,可能希望是用 Notepad打開,而不是用系統缺省的IE浏覽器打開。實現的方法是打開菜單欄中的WorkBenchàPreferences對話框,之後在對話框中選擇WorkBenchàFile Editors,然後添加文件類型,如*.html,再為其指定編輯器即可。
在編輯窗口,還值得注意的是,習慣了IVJ的程序員在編輯Java程序的時候,更願意以方法為獨立的編輯單位(即在編輯窗口中只顯示單個的方法,而不是程序全部的源代碼),這種方式也的確是非常合理的開發方式,不僅代碼的顯示更加簡捷,還能輔助程序員編出封裝性更好的類。在Eclipse在工具欄上提供了一個切換按鈕,可以在"顯示全部代碼"和"只顯示所選單元"(這裡的單元指的是單個方法、變量、導入的包等)之間切換(可參考下面的圖三)。建議沒
有使用過IVJ的程序員也嘗試一下在"只顯示所選單元"狀態下進行代碼開發。
其次要介紹的是觀察窗口,它配合編輯窗口並提供了多種的相關信息和浏覽方式。常用的觀察窗口有資源浏覽窗口(Navigator),Java包浏覽窗口(Packages),控制台(Console),任務欄(Task)等等。
浏覽窗口和Java浏覽窗口是觀察窗口核心部分。前者和Windows的浏覽器差不多,能浏覽項目文件夾中的所有文件,後者用來浏覽項目中的 Java包,包中的類,類中的變量和方法等信息。在Java浏覽窗口中可以通過用鼠標右鍵的菜單中的Open Type Hierarchy打開層次浏覽窗口(Hierarchy),這個窗口非常實用,它能非常清晰的查看類的層次結構。類中的編譯出錯信息可以在任務窗口中查到,同時它也可以成為名符其實的任務窗口:向其中添加新的任務描述信息,來跟蹤項目的進度。控制台則主要用來顯示程序的輸出信息。在調試程序的時候,會有更豐富的觀察窗口來幫助程序員進行調試,如變量值察看窗口,斷點窗口等等。
觀察窗口是任何IDE開發環境的核心,用好觀察窗口是也就是用好IDE開發環境。Eclipse提供了豐富的觀察窗口,能真正用好這些窗口恐怕要得經過一段時間的磨練。
最後介紹視圖。一個視圖包括一個或多個編輯窗口和觀察窗口。在開發環境的最左側的快捷欄中的上部分顯示的就是當前所打開的視圖圖標。視圖是 Eclipse的最靈活的部分,可以自定義每個視圖中包含的觀察窗口種類,也可以自定義一個新視圖。這些功能都被包括在"Perspective" 菜單中。在Eclipse的Java開發環境中提供了幾種缺省視圖,如資源視圖(Resource Perspective,它也是第一次啟動Eclipse時的缺省視圖),Java視圖(Java Perspective),調試視圖(Debug Perspective),團隊視圖(Team Perspective)等等。每一種視圖都對應不同種類的觀察窗口。可以從菜單欄中的PerspectiveàShow View看到該視圖對應的觀察窗口。當然,每個視圖的觀察窗口都是可配置的,可以在菜單欄中的PerspectiveàCustomize進行配置。多樣化的視圖不但可以幫助程序員以不同角度觀察代碼,也可以滿足不同的編程習慣。
3. 編譯與運行
在IVJ中調試功能非常強大,多種跟蹤方式,斷點設置,變量值察看窗口等等。這些在Eclipse中都也有提供。在本文下面介紹插件的時候,會結合例子更加詳細的介紹如何使用配置項目環境,如何運行和調試程序。
在Java視圖中,工具欄中有兩個按鈕,分別用來進行調試和運行。並且可能由於安裝的插件不同Eclipse會存在多種運行/調試程序的方式,為了確定當前項目用那一種方式運行,需要在項目的屬性選項中的設置LauncheràRun/Debug選項。通常我們需要用的是"Java Applicantion"方式。在這種方式下,如果當前位置是包含main()方法的Java程序,點擊調試/運行按鈕就會立即開始執行調試/運行功能。如果當前位置是在包或項目上,Eclipse會搜索出當前位置所包含的所有可執行程序,然後由程序員自己選擇運行那一個。
在目前的Eclipse的Release和Stable版本中缺省安裝了插件開發環境(Plug-in Development Environment,即PDE,它本身也是一個插件),此時系統除了"Java Applicantion" 運行方式,可能還有另外兩種方式:"Run-time WorkBench"和"Run-time WorkBench with Tracing",當用PDE開發插件的時候會用到這兩種運行方式,在下面我們也有提到。
4. 版本管理
可以把Eclipse的版本管理分為個人(或稱為本地)和團隊兩種。
Eclipse提供了強大的個人版本管理機制,每一次被保存的更改都可以得到恢復。而且可以精確到每一個方法的版本恢復。操作也十分方便,在任何一個能看到所要操作文件的觀察窗口中,例如資源浏覽窗口,選中該文件,點擊右鼠標鍵,選擇Compare with或Replace with,如果是恢復已經被刪除的方法則可以選擇Add from local history,之後相應的本地歷史記錄就會顯示出來,按照你的需求找到相應的版本就可以了。強大的個人版本管理功能為程序員提供了更多的信心:只管編下去,任何不小心的錯誤都可以恢復,在Eclipse下開發,是有"後悔藥"的!
Eclipse缺省為版本管理工具CVS提供了接口,可以非常方便的連接到CVS服務器上。通過CVS版本管理,Eclipse為團隊開發提供良好的環境。要連接CVS服務器需要先打開團隊視圖(Team Perspective),然後在Reponsitories觀察窗口中點擊鼠標右鍵並選擇新建(New),在打開的對話框中可以填入要連接的CVS庫所需要的信息,如CVS服務器類型,目前Eclipse支持三種方式:pserver、extssh和ext,還要填入用戶名,主機名,密碼, reponsitory地址等信息。
在Eclipse中使用CVS需要注意的是一些術語和功能的變化,CVS中的Branch這裡被稱為Stream,取消了CVS中check out、import和commit等功能,統統用鼠標右鍵菜單中的Team->Synchronized with Stream來替代。這些功能都通過圖形界面完成,在每次操作中都會有當前文件和以前各個版本的比較窗口,操作非常直觀,易於掌握,因此這裡也就不再做進一步介紹了。
5. 使用插件
使用插件可以豐富Eclipse的功能。下面將介紹如何應用插件來嵌入Tomcat服務器。這個插件並不是Eclipse項目組開發的,而是一家叫sysdeo的公司開發,非常小巧,只有27.8K。你可以到http://www.sysdeo.com/eclipse/tomcatPlugin.html去免費下載。另外,這個插件只支持Tomat4.0以上的版本,可以在www.apache.org得到Tomcat的最新版本。
要安裝插件只需將下載的zip文件按原路徑解壓到"你的Eclipse的安裝路徑\plugins"下面,然後重新啟動Eclipse。啟動後在菜單欄上選擇PerspectiveàCustomize,在打開的對話框中選中OtheràTomcat。之後馬上會發現Eclipse有了兩處變化:菜單欄中多了一個Tomcat選項,工具欄中多了兩個按鈕,上面是大家可能非常熟悉的Tomcat小貓,如下圖三。除此之外,在菜單欄中選擇: WorkbenchàPreferences,打開對話框後會發現這也多了一個Tomcat選項,在這裡要求指定你的Tomcat安裝根路徑。之後還要檢查一下在Preferences對話框中的JavaàInstalled JRE所指定的JRE和啟動Tomcat的JRE是否為同一個JRE,如果不是,可能會導致Tomat不能正常啟動。如果以上檢查沒有問題,就可以用工具欄上的"小貓"直接起動Tomcat了。要注意的是,啟動過程很慢,要耐心等到以下信息出現:
Starting service Tomcat-Standalone
Apache Tomcat/4.0.1
Starting service Tomcat-Apache
Apache Tomcat/4.0.1
之後就可以在外部浏覽器(如IE)中輸入http://localhost:8080來測試Tomcat是否正常。
[myimg]upload/eclipse3.png[/myimg]
圖三
如果啟動正常,可以進一步嘗試在Eclipse中調試Servlet或JSP程序。下面我們將用Tomcat自帶的Servlet例程HelloWorldExample.java來示范一下如何在Eclipse中調試Sevlet程序。
首先要在Java視圖中新建一個Java項目,為了方便,可以直接將項目路徑指定到HelloWorldExmaple程序所在路徑,如圖四:
[myimg]upload/eclipse4.png[/myimg]
圖四
之後按"Next",進入Java Settings對話框,選擇Libraries標簽,並用Add External JARs按鈕來指定Servlet.jar包的位置。這裡直接用了Tomcat中的Servlet.jar包。如圖五:
[myimg]upload/eclipse5.png[/myimg]
圖五
最後,點擊"Finish"完成項目的生成。在新生成項目中的default package可以找到HelloWorldExample.java,雙擊打開文件,並可嘗試給HelloWorldExample加上一個斷點(雙擊編輯窗口左側邊界)。之後在外部浏覽器中輸入http://localhost:8080/examples/servlet/HelloWorldExample,再回過來看Eclipse發生了什麼變化,是一個調試窗口呀!在Eclipse中進行的調試操作和絕大多數的IDE大同小異,如設置斷點,單步跟蹤,變量值察看等等,在這裡也就不用再詳述了。
二.開發Eclipse插件(Plug-ins)
Eclipse最有魅力的地方就是它的插件體系結構。在這個體系中重要的概念是擴展點(extension points),也就是為插件提供的接口。每一個插件都是在現有的擴展點上開發,並可能還留有自己的擴展點,以便在這個插件上繼續開發。
由於有了插件,Eclipse系統的核心部分在啟動的時候要完成的工作十分簡單:啟動平台的基礎部分和查找系統的插件。在Eclipse中實現的絕大部分功能是由相應的插件完成的,比如WrokBench UI插件完成界面的外觀顯示,Resource Management插件完成維護或生成項目或文件等資源管理工作(在下面的第二個例子就會用到這個插件),而Version and Configuration Management (VCM)插件則負責完成版本控制功能,等等。雖然以上提到的每一個功能都是絕大多數IDE環境所必備的功能,Eclipse卻也把它們都做成了插件模式,甚至用來開發Java程序的開發環境(Java development tooling,JDT)也只不過是Eclipse系統中的一個普通插件而已。整個Eclipse體系結構就象一個大拼圖,可以不斷的向上加插件,同時,現有插件上還可以再加插件。下面的插件開發示例就是在WorkBench UI插件中的觀察窗口擴展點上開發的。
本文第一部分介紹過Eclipse的開發界面其中之一就是觀察窗口,它通常配合編輯窗口顯示一些有用的信息,在這裡我們只簡單生成一個顯示歡迎信息的觀察窗口,假設新插件的名子叫Welcome。
第一步,先用向導新建一個Java項目。我們可以在菜單欄選擇FileàNew,或用工具欄的向導按鍵,或是在資源窗口用鼠標右鍵菜單中的New,打開向導對話框,然後用缺省方式創建項目。並在項目中建立一個Welcome.java文件,代碼如下:
package com.nidapeng.eclipse.plugin;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;
import org.eclipse.ui.part.ViewPart;
public class Welcome extends ViewPart {
Label label;
public Welcome() {
}
public void createPartControl(Composite parent) {
label = new Label(parent, SWT.WRAP);
label.setText("Welcome to Eclipse");
}
public void setFocus() {
}
}
為使這個程序能正常編譯,要配置它的編譯環境,即指定所需的CLASSPATH。在Eclipse中可以用幾種方法,常用的是兩種:第一是在資源窗口或Java包窗口選中該項目,點擊鼠標右鍵,在打開的菜單中選擇屬性(Properties),之後在屬性對話框中選擇Java Build PathàLibraries,用Add External JARs功能添加三個包,它們都是Eclipse的現有插件的類包,可以在"你的Eclipse安裝路徑\plugins"下面的相應路徑中找到。分別是 org.eclipse.core.runtime插件中的runtime.jar,org.eclipse.swt中的swt.jar和 org.eclipse.ui中的workbench.jar。第二種指定CLASSPATH的方法是先將以上提到的三個包直接導入到Eclipse中的某下一個項目中。如果導入到和Welcome.java相同的項目中,則無需進一步指定CLASSPATH,否則需要在項目的屬性菜單中選擇Java Build PathàProjects,然後選中這三個包所在的項目。
在我們的項目中還要生成一個XML文件,它的名字必須plugin.xml。代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="com.nidapeng.eclipse.plugin"
name="Welcome to Eclipse"
version="1.0"
provider-name="Ni Dapeng">
<requires>
<import plugin="org.eclipse.ui"/>
</requires>
<runtime>
<library name="welcome.jar"/>
</runtime>
<extension
point="org.eclipse.ui.views">
<category
name="Welcome"
id="com.nidapeng.eclipse.plugin.category1">
</category>
<view
name="Welcome to Eclipse"
category="com.nidapeng.eclipse.plugin.category1"
class="com.nidapeng.eclipse.plugin.Welcome"
id="com.nidapeng.eclipse.plugin.view1">
</view>
</extension>
</plugin>
在plugin.xml中一共有四個主要的標簽:plugin,requires,runtime,extension。其中plugin標簽的屬性提供的是我們要開發的Welcome插件的基本信息,除了name,version,provider-name等,最重要的是id,它要求不能和現有的Eclipse插件id有沖突,因此我們用包名作為插件的id。requires標簽中所列出的是需要的插件,這裡我們要用到Eclipse Workbench和SWT API,因此導入了org.eclipse.ui插件。runtime標簽指明的是我們開發的插件所在JAR包的文件名。extension標簽是插件擴展點的信息。org.eclipse.ui.views是Eclipse系統提供的觀察窗口擴展點,我們的例子是一個觀察窗口(View),這表明我們是要在 org.eclipse.ui.views擴展點上進一步開發。extension中還包括category和view兩個標簽,在後續的啟動 Welcome插件步驟中,我們就會知道這兩個標簽的含義。要注意的是category和view標簽的id的唯一性,並且在view的屬性中聲明了 Welcome插件的類名。
在Eclipse中為plugin.xml提供了缺省可視化的編輯器,在編寫plugin.xml過程中可以借助這個編輯器完成一些工作。如果你直接錄入了plugin.xml文件源代碼,還可以用這個編輯器校驗你的代碼:如果編輯器不能正確讀入,就表明你的plugin.xml有一些問題。
在確認Weclome.java和plugin.xml都正確無誤之後,可以用Eclipse菜單欄中的Export命令將 Weclome.java導出為JAR文件,它的名子應該和plugin.xml中runtime聲明的JAR相一致。同時導出plugin.xml。安裝Welcome插件的方法和本文第一部分介紹的安裝Tomcat插件方法是一樣的:首先在"Eclipse的安裝路徑\plugins"路徑下面建立一個com.nidapeng.eclipse.plugin路徑,然後將Weclome.jar和plugin.xml拷到這個路徑下。之後必需重新啟動 Eclipse,在Eclipse啟動的時候,它會搜索所有在插件路徑下的插件並注冊它們(僅僅是注冊,只有在需要某個插件的時候,Eclipse才會啟動它)。在重新啟動的Eclipse的菜單欄中選擇PerspectiveàShow ViewàOthers,在打開的對話框中我們會找到在plugin.xml中extension的category標簽中聲明的name屬性: Welcome。在Welcome的支結點中包含了view標簽name屬性:Welcome to Eclipse。選中它並確認,Welcome窗口就會顯示在Eclipse Workbench上的某個位置。如果在執行了以上操作,但沒有顯示新窗口,可以再次打開Show View菜單,此時在菜單中應該有新一頂選擇:Welcome to Eclipse,然後選中它。
上面我們完成了一個觀察窗口的插件,但這個操作過程對開發稍微復雜一些的插件就顯得不太方便了:每次測試都要將代碼打包,發布,再重新啟動 Eclipse系統!為此Eclipse提供了一個專門為開發插件而做插件(有點繞嘴):Plug-in Development Environment(PDE)。本文前面曾提到,目前Eclipse的Release或Stable版本缺省提供了這個插件,因此如果安裝的 Eclipse是這兩個版本中的一個就可以直接進行下面的步驟。下面我們再用PDE環境開發一個稍微復雜一些的插件。
第一步仍然要新建一個項目,只是在向導中不是用Java項目,而是Plug-in Development中的Plug-in Project。在應用向導生成新項目的時候,要注意兩點:第一是PDE的項目名稱就是plugin的id,因此要保證它的唯一性,這裡我們的項目名是 com.nidapeng.eclipse.plugin.pde。其次為了進一步說明Eclipse插件的結構,在Plug-in Code Generators中,選擇用向導模板生成一個缺省的插件,如圖六:
[myimg]upload/eclipse6.png[/myimg]
圖六
這個用缺省方式生成的插件類對於我們將要的代碼並不是必需的,也可以用生成空插件的方式建立我們的項目,這樣做只是為進一步說明Eclipse的插件結構。
項目生成之後,在我們的項目中會包含一個PdePlugin.java文件,它就是以缺省方式生成的插件類。注意到它繼承了 AbstractUIPlugin類,而AbstractUIPlugin類實現了org.eclipse.ui.plugin接口。事實上,所有的 Eclipse插件都會有一個相應的實現plugin接口的類,這個類將是新插件的主類(類似於有main()函數的Java類),它負責管理插件的生存期。在我們的AbstractUIPlugin繼承子類中,可以用singleton模式來保存在Eclipse中的生成的該插件的第一個也是唯一實例,一般來說,在該繼承子類中也要實現一個getDefault()方法以返回當前插件的實例。而且,當Eclipse首次使用該插件的時候,這個主類將是第一個被調用的類,因此我們也可以在它的代碼中執行一些初始化的工作。而且如果插件需要使用Preferences,Dialogs或Images資源,也可以通過這個類中的相應方法來得到它們的實例,如用其中的getDialogSettings(),getPreferenceStore(), getImageRegistry()方法。
但是象前面提到的,PdePlugin.java對下面的例子並不是必需的,我們不用對它進行任何修改。在我們第一個例子中的Weclome插件,根本就沒有生成AbstractUIPlugin的繼承子類,此時系統會自動為Weclome插件生成一個缺省的主類(類似於Java類構造函數,如果沒有聲明,系統會指定一個默認的構造函數)。
下面的代碼是才真正實現了我們新插件的功能,假設這個插件名子是NoticeView:
package com.nidapeng.eclipse.plugin.pde;
import org.eclipse.core.resources.*;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.runtime.CoreException;
import java.util.ResourceBundle;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
public class NoticeView extends ViewPart implements
Runnable,IResourceChangeListener ,IResourceDeltaVisitor{
private ResourceBundle resourceBundle;
private Label label;
private Display disp;
private String dispTxt;
public NoticeView() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(this,
IResourceChangeEvent.PRE_CLOSE
IResourceChangeEvent.PRE_DELETE
IResourceChangeEvent.PRE_AUTO_BUILD
IResourceChangeEvent.POST_AUTO_BUILD
IResourceChangeEvent.POST_CHANGE);
}
public static IWorkspace getWorkspace() {
//ResourcesPlugin插件的主類!
return ResourcesPlugin.getWorkspace();
}
public void createPartControl(Composite parent) {
label = new Label(parent, SWT.WRAP);
label.setText("change your project status...");
disp = Display.getDefault();
}
public void setFocus() {
}
// 實現IResourceChangeListener接口中的resourceChanged方法
public void resourceChanged(IResourceChangeEvent event) {
IResource res = event.getResource();
switch (event.getType()) {
case IResourceChangeEvent.PRE_CLOSE :
dispTxt = res.getFullPath() + " is about to closed!";
break;
case IResourceChangeEvent.PRE_DELETE :
dispTxt = res.getFullPath() + " is about to be deleted!";
break;
case IResourceChangeEvent.POST_CHANGE :
try {
event.getDelta().accept(this);
} catch (CoreException e) {
e.printStackTrace();
}
break;
case IResourceChangeEvent.PRE_AUTO_BUILD :
try {
event.getDelta().accept(this);
} catch (CoreException e) {
e.printStackTrace();
}
break;
case IResourceChangeEvent.POST_AUTO_BUILD :
try {
event.getDelta().accept(this);
} catch (CoreException e) {
e.printStackTrace();
}
break;
}
disp.syncExec(this);
}
// 實現IResourceDeltaVisitor接口中的visit方法
public boolean visit(IResourceDelta delta) {
IResource res = delta.getResource();
switch (delta.getKind()) {
case IResourceDelta.ADDED :
dispTxt = "Resource "+res.getFullPath()+" was added.";
break;
case IResourceDelta.REMOVED:
dispTxt = "Resource "+res.getFullPath()+" was removed.";
break;
case IResourceDelta.CHANGED :
dispTxt = "Resource "+res.getFullPath()+" has changed.";
break;
}
return true; // visit the children
}
// 實現Runnable接口中的run方法
public void run() {
try {
label.setText(dispTxt);
} catch (Exception e) {
e.printStackTrace();
}
}
}
象上面的第一個Welcome插件,這個新插件同樣繼承了ViewPart,不同的是實現了三個接口:Runnable, IResourceChangeListener ,IResourceDeltaVisitor。其中的Runnable大家應該很熟悉:多線程的接口。而 IResourceChangeListener和IResourceDeltaVisitor是Eclipse系統中的資源接口,這裡的資源是指 Eclipse中的項目或文件等。在下面運行NoticeView插件的過程中你可以通過添加、打開、刪除項目或文件來觸發這兩個接口中的事件,並在我們的觀察窗口中顯示相關信息。
在程序中比較奇怪部分的是在resourceChanged()函數裡面,並沒有象大家想象的那樣直接調用label.setText()方法來顯示信息,而是調用了disp.syncExec(this),其中的disp是Display類型的對象。這是因為resourceChanged()方法運行的線程和lable所在插件運行的Eclipse主線程並不是同一個線程,如果直接調用label.setText()方法,會拋出一個異常。
下面還需要對項目中的plugin.xml進行一些改動,主要就是加上擴展點聲明:
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="com.nidapeng.eclipse.plugin.pde"
name="Pde Plugin"
version="1.0.0"
provider-name="NIDAPENG"
class="com.nidapeng.eclipse.plugin.pde.PdePlugin">
<requires>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.ui"/>
</requires>
<runtime>
<library name="pde.jar"/>
</runtime>
<extension
id="NoticeView"
name="Notice View"
point="org.eclipse.ui.views">
<category
name="Notice"
id="com.nidapeng.eclipse.plugin.pde.category1">
</category>
<view
name="Notice Resource View"
category="com.nidapeng.eclipse.plugin.pde.category1"
class="com.nidapeng.eclipse.plugin.pde.NoticeView"
id="com.nidapeng.eclipse.plugin.pde.view1">
</view>
</extension>
</plugin>
這個xml文件和Welcome插件的plugin.xml非常接近,這裡就不做過多的說明了。
要運行這個插件,可以直接用Eclipse中的運行按鈕,因為這個項目是一個Plug-in Project,此時項目會自動以Run-time Workbench方式運行。運行後,會生成一個和當前Eclipse完全一致的平台,在這個平台上可以直接運行NoticeView插件,查看這個插件到底會執行什麼功能,也可以用直接Run-time Workbench方式調試插件。這裡省去了安裝插件,重啟動Eclipse等過程,可以看到用PDE開發插件的過程比直接用Java開發環境簡潔了很多!
Eclipse的開發不僅僅限於插件的開發,它還可以取代Java中的標准Swing,進行基於Java的獨立應用程序GUI開發。它帶來的好處是顯而易見的:高速,資源占用低,跨平台,代碼開放,有大公司的支持等等。
由於Eclipse目前還在開發階段,筆者在用它調試程序時發現有些性能還不是十分的穩定,一些地方會遇到奇怪的問題,要求使用者能想一些辦法解決。不過,以現在Eclipse的開發速度,相信過不了多久,它的各種功能會逐步完善。目前Eclipse雖然有種種不足,但瑕不掩玉,筆者對 Eclipse的總體印象還是非常不錯的,運行速度,資源占用都要好於IVJ,操作起來也大多順手,而且即使在現階段也很少有意外退出等重大的Bug發生,希望未來的Eclipse能真正達到IVJ的功能,VisualCafe的速度,成為廣大程序員開發軟件的一大利器!
參考資源:
www.eclipse.org是Eclipse的資源總站。
關於作者
倪大鵬,有五年的軟件開發經驗,其中的近四年時間裡是在從事與Java相關技術的應用與開發。你可以通過e-mail:
[email protected]與他聯系。
在程序中比較奇怪部分的是在resourceChanged()函數裡面,並沒有象大家想象的那樣直接調用label.setText()方法來顯示信息,而是調用了disp.syncExec(this),其中的disp是Display類型的對象。這是因為resourceChanged()方法運行的線程和lable所在插件運行的Eclipse主線程並不是同一個線程,如果直接調用label.setText()方法,會拋出一個異常。
下面還需要對項目中的plugin.xml進行一些改動,主要就是加上擴展點聲明:
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="com.nidapeng.eclipse.plugin.pde"
name="Pde Plugin"
version="1.0.0"
provider-name="NIDAPENG"
class="com.nidapeng.eclipse.plugin.pde.PdePlugin">
<requires>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.ui"/>
</requires>
<runtime>
<library name="pde.jar"/>
</runtime>
<extension
id="NoticeView"
name="Notice View"
point="org.eclipse.ui.views">
<category
name="Notice"
id="com.nidapeng.eclipse.plugin.pde.category1">
</category>
<view
name="Notice Resource View"
category="com.nidapeng.eclipse.plugin.pde.category1"
class="com.nidapeng.eclipse.plugin.pde.NoticeView"
id="com.nidapeng.eclipse.plugin.pde.view1">
</view>
</extension>
</plugin>
這個xml文件和Welcome插件的plugin.xml非常接近,這裡就不做過多的說明了。
要運行這個插件,可以直接用Eclipse中的運行按鈕,因為這個項目是一個Plug-in Project,此時項目會自動以Run-time Workbench方式運行。運行後,會生成一個和當前Eclipse完全一致的平台,在這個平台上可以直接運行NoticeView插件,查看這個插件到底會執行什麼功能,也可以用直接Run-time Workbench方式調試插件。這裡省去了安裝插件,重啟動Eclipse等過程,可以看到用PDE開發插件的過程比直接用Java開發環境簡潔了很多!
Eclipse的開發不僅僅限於插件的開發,它還可以取代Java中的標准Swing,進行基於Java的獨立應用程序GUI開發。它帶來的好處是顯而易見的:高速,資源占用低,跨平台,代碼開放,有大公司的支持等等。
由於Eclipse目前還在開發階段,筆者在用它調試程序時發現有些性能還不是十分的穩定,一些地方會遇到奇怪的問題,要求使用者能想一些辦法解決。不過,以現在Eclipse的開發速度,相信過不了多久,它的各種功能會逐步完善。目前Eclipse雖然有種種不足,但瑕不掩玉,筆者對 Eclipse的總體印象還是非常不錯的,運行速度,資源占用都要好於IVJ,操作起來也大多順手,而且即使在現階段也很少有意外退出等重大的Bug發生,希望未來的Eclipse能真正達到IVJ的功能,VisualCafe的速度,成為廣大程序員開發軟件的一大利器!
參考資源:
www.eclipse.org是Eclipse的資源總站。
關於作者
倪大鵬,有五年的軟件開發經驗,其中的近四年時間裡是在從事與Java相關技術的應用與開發。你可以通過e-mail:
[email protected]與他聯系。
switch (event.getType()) {
case IResourceChangeEvent.PRE_CLOSE :
dispTxt = res.getFullPath() + " is about to closed!";
break;
case IResourceChangeEvent.PRE_DELETE :
dispTxt = res.getFullPath() + " is about to be deleted!";
break;
case IResourceChangeEvent.POST_CHANGE :
try {
event.getDelta().accept(this);
} catch (CoreException e) {
e.printStackTrace();
}
break;
case IResourceChangeEvent.PRE_AUTO_BUILD :
try {
event.getDelta().accept(this);
} catch (CoreException e) {
e.printStackTrace();
}
break;
case IResourceChangeEvent.POST_AUTO_BUILD :
try {
event.getDelta().accept(this);
} catch (CoreException e) {
e.printStackTrace();
}
break;
}
disp.syncExec(this);
}
// 實現IResourceDeltaVisitor接口中的visit方法
public boolean visit(IResourceDelta delta) {
IResource res = delta.getResource();
switch (delta.getKind()) {
case IResourceDelta.ADDED :
dispTxt = "Resource "+res.getFullPath()+" was added.";
break;
case IResourceDelta.REMOVED:
dispTxt = "Resource "+res.getFullPath()+" was removed.";
break;
case IResourceDelta.CHANGED :
dispTxt = "Resource "+res.getFullPath()+" has changed.";
break;
}
return true; // visit the children
}
// 實現Runnable接口中的run方法
public void run() {
try {
label.setText(dispTxt);
} catch (Exception e) {
e.printStackTrace();
}
}
}
象上面的第一個Welcome插件,這個新插件同樣繼承了ViewPart,不同的是實現了三個接口:Runnable, IResourceChangeListener ,IResourceDeltaVisitor。其中的Runnable大家應該很熟悉:多線程的接口。而 IResourceChangeListener和IResourceDeltaVisitor是Eclipse系統中的資源接口,這裡的資源是指 Eclipse中的項目或文件等。在下面運行NoticeView插件的過程中你可以通過添加、打開、刪除項目或文件來觸發這兩個接口中的事件,並在我們的觀察窗口中顯示相關信息。