開發(fā) Eclipse 插件
級(jí)別: 初級(jí)
David Gallardo, 軟件顧問
2003 年 3 月 26 日
在本文中,David Gallardo 向您展示了如何使用 Plug-in Development Environment 的代碼生成向?qū)韯?chuàng)建 Eclipse 插件。您將學(xué)到如何在運(yùn)行時(shí)工作臺(tái)中運(yùn)行和調(diào)試插件,并且在 Eclipse 中安裝完成的插件。David 還研究了與打包插件相關(guān)的問題 ― 包括維護(hù)版本信息、以插件片段的形式更新功能,以及組合插件來創(chuàng)建完整的功能部件。
Eclipse 平臺(tái)是 IBM 向開發(fā)源碼社區(qū)捐贈(zèng)的開發(fā)框架,它之所以出名并不是因?yàn)?IBM 宣稱投入開發(fā)的資金總數(shù) ― 4 千萬美元 ― 而是因?yàn)槿绱司薮蟮耐度胨鶐淼某晒阂粋€(gè)成熟的、精心設(shè)計(jì)的以及可擴(kuò)展的體系結(jié)構(gòu)。Eclipse 的價(jià)值是它為創(chuàng)建可擴(kuò)展的集成開發(fā)環(huán)境提供了一個(gè)開放源碼平臺(tái)。這個(gè)平臺(tái)允許任何人構(gòu)建與環(huán)境和其它工具無縫集成的工具。
工具與 Eclipse 無縫集成的關(guān)鍵是 插件。除了小型的運(yùn)行時(shí)內(nèi)核之外,Eclipse 中的所有東西都是插件。從這個(gè)角度來講,所有功能部件都是以同等的方式創(chuàng)建的。從這個(gè)角度來講,所有功能部件都是以同等的方式創(chuàng)建的。
但是,某些插件比其它插件更重要些。Workbench 和 Workspace 是 Eclipse 平臺(tái)的兩個(gè)必備的插件 ― 它們提供了大多數(shù)插件使用的擴(kuò)展點(diǎn),如圖 1 所示。插件需要擴(kuò)展點(diǎn)才可以插入,這樣它才能運(yùn)行。
圖 1. Eclipse Workbench 和 Workspace:必備的插件支持

Workbench 組件包含了一些擴(kuò)展點(diǎn),例如,允許您的插件擴(kuò)展 Eclipse 用戶界面,使這些用戶界面帶有菜單選擇和工具欄按鈕;請(qǐng)求不同類型事件的通知;以及創(chuàng)建新視圖。Workspace 組件包含了可以讓您與資源(包括項(xiàng)目和文件)交互的擴(kuò)展點(diǎn)。
當(dāng)然,其它插件可以擴(kuò)展的 Eclipse 組件并非只有 Workbench 和 Workspace。此外,還有一個(gè) Debug 組件可以讓您的插件啟動(dòng)程序、與正在運(yùn)行的程序交互,以及處理錯(cuò)誤 ― 這是構(gòu)建調(diào)試器所必需的。雖然 Debug 組件對(duì)于某些類型的應(yīng)用程序是必需的,但大多數(shù)應(yīng)用程序并不需要它。
還有一個(gè) Team 組件允許 Eclipse 資源與版本控制系統(tǒng)(VCS)交互,但除非您正在構(gòu)建 VCS 的 Eclipse 客戶機(jī),否則 Team 組件,就象 Debug 組件一樣,不會(huì)擴(kuò)展或增強(qiáng)它的功能。
最后,還有一個(gè) Help 組件可以讓您提供應(yīng)用程序的聯(lián)機(jī)文檔和與上下文敏感的幫助。沒有人會(huì)否認(rèn)幫助文檔是專業(yè)應(yīng)用程序必備的部分,但它并不是插件功能的必要部分。
上述每個(gè)組件提供的擴(kuò)展點(diǎn)都記錄在 Eclipse Platform Help 中,該幫助在 Platform Plug-in Developer 指南的參考部分中。乍一看,尤其是 API 參考大全的 Workbench 部分,一開始會(huì)令人望而卻步。我們不會(huì)深入了解眾多可用擴(kuò)展點(diǎn)的詳細(xì)信息,而只是粗略地看一個(gè)簡單插件及其組件。
![]() |
|
創(chuàng)建插件最簡單的方法是使用 Plug-in Development Environment(PDE)。PDE 和 Java Development Tooling(JDT)IDE 是 Eclipse 的標(biāo)準(zhǔn)擴(kuò)展。PDE 提供了一些向?qū)б詭椭鷦?chuàng)建插件,包括我們將在這里研究的“Hello, world”示例。
從 Eclipse 菜單,選擇 File=>New=>Other(或按 Ctrl-N),然后選擇 Select 對(duì)話框左邊的 Plug-in Development 向?qū)АT?Select 對(duì)話框的右邊,選擇 Plug-in Project。按 Next。在下一屏上,輸入項(xiàng)目名稱;我使用了 com.example.hello
。再次按 Next。在下一屏上,請(qǐng)注意,插件標(biāo)識(shí)就與項(xiàng)目名稱相同。使用項(xiàng)目名稱作為插件標(biāo)識(shí)可以將該插件與另一個(gè)插件的名稱發(fā)生沖突的機(jī)會(huì)減到最小。再按一次 Next。下一屏讓您選擇是手工創(chuàng)建初始插件代碼,還是運(yùn)行代碼生成向?qū)А1A舸a生成向?qū)У娜笔∵x項(xiàng),選擇“Hello, World”,然后按 Next,如圖 2 所示。
圖 2. 選擇“Hello, World”代碼生成向?qū)?

下一屏要求一些附加信息。請(qǐng)注意這一屏上的信息:它包含了插件名稱、版本號(hào)、提供者名稱和類名。這些是關(guān)于插件的重要信息,我們將在稍后研究。可以接受向?qū)峁┑娜笔≈怠0?Next。在下一屏幕上,接受包名、類名和消息文本的缺省值。選擇“Add the action set to the resource perspective”復(fù)選框。按 Finish。
如果接到通知:向?qū)枰獑⒂媚承┢渌寮拍芡瓿桑敲窗?OK。
過一會(huì)兒,向?qū)⑼瓿桑谀墓ぷ鲄^(qū)中將會(huì)有一個(gè)新的項(xiàng)目,名為 com.example.hello
,如圖 3 所示。
圖 3. PDE 透視圖:Welcome to Hello Plug-in

在 Package Explorer 中,工作臺(tái)的左邊是向?qū)?chuàng)建的一些東西的概述。大多數(shù)項(xiàng)都不引人關(guān)注:包括項(xiàng)目類路徑中的許多 .jar
文件(這些包括插件和 Java 運(yùn)行時(shí)所需的 Eclipse 類)、一個(gè)圖標(biāo)文件夾(包含了工具欄按鈕的圖形),以及 build.properties
文件(包含自動(dòng)構(gòu)建腳本所使用的變量)。
這里最有意思的東西是 src 文件夾,它包含了插件和 plugin.xml 文件的源代碼 ― plug-in.xml 是插件的清單文件。我們將先查看 plugin.xml。
![]() |
|
插件清單文件 plugin.xml 包含了 Eclipse 將插件集成到框架所使用的描述信息。缺省情況下,當(dāng)?shù)谝淮蝿?chuàng)建插件時(shí),會(huì)在清單編輯器區(qū)域中打開 plugin.xml。編輯器底部的選項(xiàng)卡讓您可以選擇關(guān)于插件的不同信息集合。Welcome 選項(xiàng)卡顯示了消息“Welcome to Hello Plug-In”,并且簡要討論了所使用的模板和關(guān)于使用 Eclipse 實(shí)現(xiàn)插件的提示。選擇“Source”選項(xiàng)卡可以讓您查看 plugin.xml 文件的完整源代碼。
讓我們看看插件清單文件的各個(gè)部分。首先是關(guān)于插件的常規(guī)信息,包括它的名稱、版本號(hào)、實(shí)現(xiàn)它的類文件的名稱和 .jar
文件名。
清單 1. 插件清單文件 ― 常規(guī)信息
|
接著,列出了我們的插件所需的插件:
清單 2. 插件清單文件 ― 必需的插件
|
列出的第一個(gè)插件 org.eclipse.core.resources
是工作區(qū)插件,但實(shí)際上我們的插件并不需要它。第二個(gè)插件 org.eclipse.ui
是工作臺(tái)。我們需要工作臺(tái)插件,因?yàn)槲覀儗U(kuò)展它的兩個(gè)擴(kuò)展點(diǎn),正如后面的 extension 標(biāo)記所指出的。
第一個(gè) extension 標(biāo)記擁有點(diǎn)屬性 org.eclipse.ui.actionSets
。操作集合是插件添加到工作臺(tái)用戶界面的一組 基值― 即,菜單、菜單項(xiàng)和工具欄。操作集合分組了基值,這樣用戶可以更方便地管理它們。例如,我們的 Hello 插件的菜單和工具欄項(xiàng)將出現(xiàn)在 Resource 透視圖中,因?yàn)楫?dāng)在運(yùn)行代碼生成向?qū)r(shí),我們做了這樣的選擇。如果用戶要更改它,可以使用 Window=>Customize Perspective菜單選項(xiàng)從要在 Resource 透視圖中顯示的項(xiàng)中除去“Sample Action Set”。
圖 4. 定制 Resource 透視圖

操作集合包含了兩個(gè)標(biāo)記: menu 標(biāo)記(描述菜單項(xiàng)應(yīng)該出現(xiàn)在工作臺(tái)菜單的什么位置,以及如何出現(xiàn))和 action 標(biāo)記(描述它應(yīng)該做什么)― 尤其是 action 標(biāo)記標(biāo)識(shí)了執(zhí)行操作的類。注:這個(gè)類不是上面列出的插件類。
清單 3. 操作集合
|
許多菜單和操作屬性的目的相當(dāng)明顯 ― 例如,提供工具提示文本和標(biāo)識(shí)工具欄項(xiàng)的圖形。但還要注意 action 標(biāo)記中的 menubarPath
:這個(gè)屬性標(biāo)識(shí)了 menu 標(biāo)記中定義的哪個(gè)菜單項(xiàng)調(diào)用 action 標(biāo)記中定義的操作。有關(guān)這個(gè)和其它工作臺(tái)擴(kuò)展點(diǎn)的詳細(xì)信息,請(qǐng)參考 Platform Plug-in Developer Guide,尤其是“Plugging into the workbench”章節(jié)(可以從 Eclipse 的幫助菜單中獲取該指南)。
由于我們選擇了將插件添加到 Resource 透視圖,于是生成了第二個(gè) extension 標(biāo)記。這個(gè)標(biāo)記會(huì)導(dǎo)致當(dāng) Eclipse 第一次啟動(dòng)并裝入我們的插件時(shí),將插件添加到 Resource 透視圖。
清單 4. extension 標(biāo)記
|
如果忽略這最后一個(gè) extension,用戶就需要使用 Window=>Customize Perspective將插件添加到 Resource(或其它)透視圖。
![]() |
|
代碼生成向?qū)闪藘蓚€(gè) Java 源文件,打開 PDE Package Explorer 中的 src 文件夾就可以看到它們。第一個(gè)文件 HelloPlugin.java
是插件類,它繼承了 AbstractUIPlugin
抽象類。 HelloPlugin
負(fù)責(zé)管理插件的生命周期,在更為擴(kuò)展的應(yīng)用程序中,它負(fù)責(zé)維護(hù)諸如對(duì)話框設(shè)置和用戶首選項(xiàng)等內(nèi)容。 HelloPlugin
要做的事就這么多:
清單 5. HelloPlugin
|
第二個(gè)源文件 SampleAction.java
包含的類將執(zhí)行在清單文件的操作集合中指定的操作。 SampleAction
實(shí)現(xiàn)了 IWorkbenchWindowActionDelegate
接口,它允許 Eclipse 使用插件的代理,這樣不是在萬不得已的情況下,Eclipse 就無需裝入插件(這項(xiàng)優(yōu)化工作使在裝入插件時(shí)發(fā)生內(nèi)存和性能方面的問題降到最低)。 IWorkbenchWindowActionDelegate
接口方法使插件可以與代理進(jìn)行交互:
清單 6. IWorkbenchWindowActionDelegate 接口方法
|
![]() |
|
當(dāng)開發(fā) Eclipse 的插件時(shí),必須停止 Eclipse 并用新的插件重新啟動(dòng)它以便進(jìn)行測試和調(diào)試,這很笨拙。幸好,Eclipse PDE 提供了一個(gè)自托管(self-hosted)的開發(fā)環(huán)境,它讓您無需將插件安裝在工作臺(tái)的單獨(dú)實(shí)例中即可運(yùn)行。
要運(yùn)行 Hello 插件,選擇 Run=>Run As=>Run-time Workbench來啟動(dòng)另一個(gè) Workbench 實(shí)例,而該實(shí)例添加了插件的菜單選項(xiàng)和工具欄,如圖 5 所示。
圖 5. 在運(yùn)行時(shí)工作臺(tái)中運(yùn)行的 Hello 插件

我們可以通過單擊工具欄按鈕或從“Sample Menu”菜單激活插件。任何一種方法都會(huì)生成一個(gè)框,其標(biāo)題是“Hello Plug-in”,內(nèi)容是“Hello, Eclipse world”,以及一個(gè) OK 按鈕,按該按鈕可以關(guān)閉這個(gè)框。
通過選擇 Run=>Debug As=>Run-time Workbench,按類似的方法調(diào)試插件。這次,當(dāng)插件在第二個(gè)工作臺(tái)實(shí)例中運(yùn)行時(shí),我們可以在最初的工作臺(tái)中單步執(zhí)行源代碼,以及檢查變量等。
一旦插件經(jīng)過測試并準(zhǔn)備發(fā)布,我們就需要將它適當(dāng)打包,以便在 Eclipse 中安裝。
![]() |
|
Eclipse 在啟動(dòng)時(shí)會(huì)查看其插件目錄來確定要裝入哪些插件。要安裝插件,我們需要在插件目錄中創(chuàng)建一個(gè)子目錄,并將程序文件和清單文件復(fù)制到那里。建議目錄名稱能表示插件的標(biāo)識(shí),并且后面跟下劃線和版本號(hào),但是這種做法不是必需的。假設(shè) Eclipse 安裝在 C:\eclipse 中;我們要?jiǎng)?chuàng)建一個(gè)目錄:
C:\eclipse\plugins\com.example.hello_1.0.0.
按照 Java 程序的標(biāo)準(zhǔn),我們的程序文件需要?dú)w檔到 .jar
文件中 — 我們的插件清單文件,您也許記得它包含這個(gè)項(xiàng):
|
要?jiǎng)?chuàng)建 hello.jar
文件,我們可以通過突出顯示項(xiàng)目名稱,并從 Eclipse 菜單選擇 File=>Export,以導(dǎo)出插件文件。選擇 JAR 文件作為導(dǎo)出方式,按 Next,然后瀏覽到我們?yōu)樗鼊?chuàng)建的目錄。下一步,我們還需要將 plugin.xml 文件復(fù)制到這個(gè)目錄。也可以使用 File=>Export菜單選項(xiàng)(但請(qǐng)要記住選擇 File System 作為導(dǎo)出目的地)。
這就是安裝插件所需的全部操作,但您將需要停止并重新啟動(dòng) Eclipse,以便能識(shí)別這個(gè)新的插件。從幫助菜單中選擇“About Eclipse Platform”,可以找到關(guān)于已安裝插件的信息,包括版本號(hào)。在出現(xiàn)的屏幕上有一個(gè)按鈕是 Plug-in Details;向下滾動(dòng)列表來尋找 Hello 插件及其版本號(hào)。
![]() |
|
在目錄名稱中包含版本號(hào)的目的是允許在同一臺(tái)機(jī)器上共存某個(gè)插件的多個(gè)版本(每次只裝入一個(gè)版本)。我們可以通過創(chuàng)建一個(gè) Hello 插件的已更新版本來看看這是如何工作的:例如,將 plugin.xml 文件中的版本號(hào)更改成“1.0.1”,然后將 SampleAction.java
中的文本更改成“New and improved Hello, Eclipse world”。從 Eclipse 菜單中選擇 Project=> Rebuild All。下一步,將項(xiàng)目文件以 JAR 形式導(dǎo)出到新的插件目錄,例如, com.example.hello_1.0.1
。將修訂過的 plugin.xml 文件復(fù)制到同一個(gè)目錄中。當(dāng)停止并重新啟動(dòng) Eclipse 時(shí),只會(huì)裝入已更新的插件。
![]() |
|
Eclipse 由插件組成,但在開發(fā) Eclipse 的插件時(shí),還要慎重考慮另外兩個(gè)級(jí)別的組件 ― 插件片段和功能部件。
插件 片段(如名稱所暗示的)是完整插件的組成部分 ― 目標(biāo)插件。片段提供的功能與目標(biāo)插件的功能合并。片段可以用于將插件本地化成各種語言;在無需形成一個(gè)全新發(fā)行版的情況下,以增量形式將功能部件添加到現(xiàn)有插件,或者提供特定于平臺(tái)的功能。在許多方面,片段與插件一樣。主要的區(qū)別就是片段沒有插件類 ― 片段的生命周期由其目標(biāo)插件管理。此外,片段的清單文件叫作 fragment.xml,它列出了目標(biāo)插件的標(biāo)識(shí)和版本號(hào),以及片段的標(biāo)識(shí)和版本號(hào)。
另一方面,插件 功能部件根本不包含編碼。在 Eclipse 體系結(jié)構(gòu)術(shù)語中,功能部件是將一組相關(guān)插件打包到完整的產(chǎn)品中。例如,JDT 是包含了象 Java 編輯器、調(diào)試器和控制臺(tái)這樣的插件的功能部件。名為 feature.xml 的清單文件描述了一個(gè)功能部件歸檔文件。在其中,該清單文件包含了對(duì)該功能部件所包含的插件和其它資源的引用、關(guān)于如何更新該功能部件的信息、版權(quán)信息和許可證信息。
在 Eclipse 中, 主功能部件設(shè)置了 Eclipse 平臺(tái)的外觀。主功能部件旨在確定諸如給予 Eclipse 其身份的閃屏和其它特征之類的東西。Eclipse 只允許一個(gè)主功能部件。用這種方式,通過創(chuàng)建一組插件,將它們打包到功能部件中,并且使這個(gè)功能部件成為主功能部件,就可以重新創(chuàng)建 Eclipse 的品牌,并將它用于創(chuàng)建全新且不同的產(chǎn)品。如果從 Eclipse.org 下載,缺省主功能部件是 eclipse.org.platform
。
![]() |
|
在插件的介紹里我們只是稍微了解一些插件的必要用法。學(xué)習(xí)插件的更多知識(shí)的最佳參考資料是 Plug-in Developer's Guide,可以從 Eclipse 中的幫助菜單中獲得該指南。該文檔包含了編程指南、Eclipse API 和插件擴(kuò)展點(diǎn)的參考大全、Eclipse.org 上可用的編程示例的指南,以及常見問題列表。另一個(gè)優(yōu)秀參考資料是 Eclipse 本身的源代碼。根據(jù)您的興趣,您也許想要查找一些示例,以了解不同工作臺(tái)功能部件(如視圖和編輯器)是如何擴(kuò)展的,或者如何使用 SWT(Eclipse 圖形 API)。此外,下面的 參考資料可以幫助您學(xué)到更多知識(shí)。
posted on 2005-12-14 17:38 Victor 閱讀(319) 評(píng)論(0) 編輯 收藏 所屬分類: eclipse