Eclipse插件開發如虎添翼

發表于:2007-06-08來源:作者:點擊數: 標簽:開發eclipse如虎添翼插件
隨著Eclipse作為一個集成 開發 環境和富客戶端(Rich Client)平臺而廣泛流行起來,更多的公司和個人進入到開發Eclipse插件的隊伍中。你想過寫一個你自己的Eclipse插件么?這篇文章中我將帶領你開發一個簡單的可視化插件。這里你可以學習Eclipse插件的體系結構

隨著Eclipse作為一個集成開發環境和富客戶端(Rich Client)平臺而廣泛流行起來,更多的公司和個人進入到開發Eclipse插件的隊伍中。你想過寫一個你自己的Eclipse插件么?這篇文章中我將帶領你開發一個簡單的可視化插件。這里你可以學習Eclipse插件的體系結構,并且學著熟悉Plug-in Development Environment(PDE)。

簡介

許多年以前,當我第一次仔細考察Eclipse時(我記得當時好像是2.0版本),我對它的完全免費印象非常深。它提供了很多非常不錯的Java開發能力,但是當時并沒有比那些商業版本好上多少。然而,真正吸引我的是我發現可以用我自己的代碼隨意擴展它的特性。事實上,并不需要特別的工具--Eclipse提供了所有可以用于自身開發的工具和框架。

從那以后,Eclipse開始在各方面成熟起來--它的設計更加改進了,它的結構變得更加強健且不失靈活,它的各種工具也變得更加強大和高效。它已經從一個工具集成框架變成了一個開發胖客戶端(rich-client)程序的平臺。這也證明了我心目中對它本身的基本設計理念的質量的評價。

擴展Eclipse需要你對可用的結構和工具的基本熟悉和了解。因為學習如何去做一件事情的最好方式就是去試著自己做做看,本篇文章將會幫助你使用插件開發環境PDE開發一個簡單的Eclipse插件。當你學習一點Eclipse體系結構的背景信息之后,你將會使用PDE向導來創建一個新的插件,完成一個簡單的工作臺視圖,并且測試你的工作看最后的結果。實現的具體細節不能一一說明了。為了完成這個工作,你需要獲得最新的Eclipse SDK(3.1版本),可以從 http://www.eclipse.org/downloads 獲得一份免費的拷貝。

所有的東西都是插件

從一個開發者的角度來說,Eclipse是一個開發各種客戶端程序的平臺。本身其是作為一個開發工具而產生的,現在它的范圍已經擴展到包括各種胖客戶端應用程序,以及非桌面環境,比如手持設備和嵌入式系統。為了支持如此大范圍的應用,高度的可擴展性是非常必要的。每個基于Eclipse的程序都包含了多個組件,它們被稱作為插件(plugins),相互間通過預先定義的接口集合進行交互。插件通過一個很小的運行時層來進行管理,負責它們的發現和啟動。從3.0版本開始,原來的運行時層實現被新的基于開放服務網關初始化(Open Services Gateway initiative, OSGi)所替代,從而提高了Eclipse向多個硬件和操作系統的移植能力,并且提供了對管理的執行環境的兼容性。因此,目前的Eclipse插件是作為OSGi的組件來開發的。

和其他的組件管理環境類似,每個Eclipse插件的運行時特性是在它的描述符中被指定的,運行時層使用描述符來配置插件的執行環境。在3.0版本以前,描述符是一個XML格式的文件,名為plugin.xml,在每個插件目錄的根目錄中保存。為了和OSGi運行時整合,插件一般被打包成JAR文件,并且它們的屬性比如單一的標識符,版本號,運行時classpath和導出的包,被包含在它們的JAR manifest中(即META-INF/MANIFEST.MF)。然而,對于一般記錄Eclipse插件的特性的描述符--插件擴展和擴展點--仍然留在plugin.xml文件中描述。

一個插件的擴展點基本上是它的組件配置點,使用XML Schema子集描述。一個完成某種抽象功能的插件,比如在工作臺顯示獨立視圖等,將會公布一個擴展點,指定每個實現必須完成什么才能被這個插件使用。這些一般需要包含簡單的屬性,比如窗口標題和圖標路徑,同時也包含實現具體接口的類名稱。在這里的例子中,每個要提供一個視圖實現的插件必須聲明一個插件描述符屬性的ID是org.eclipse.ui.views擴展點的擴展。這個擴展必須指定類實現接口的名為org.eclipse.ui.IViewPart。在運行時,工作臺插件查找插件記錄中所有的org.eclipse.ui.views的擴展并且將它們提供給用戶作為可顯示的視圖。當用戶選擇打開某個視圖時,工作臺插件初始化指定在插件描述符中視圖的實現類,并且通過接口org.eclipse.ui.IViewPart來和它交互。這個機制是Eclipse擴展性的基石。插件給其他的插件提供具體的實現,很多都是實現了自身高度抽象,并且將它們作為擴展點提供給其他的插件來完成。

Listing 1: plugin.xml的內容:

clearcase/" target="_blank" >cccccc><?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
?。紁lugin>
 ?。糴xtension point="org.eclipse.ui.views">
  ?。糲ategory id="com.developer.superview.category1" name="Developer.com"/>
  ?。紇iew category="com.developer.superview.category1" class="com.developer.superview.Superview" id="com.developer.superview.view1" name="Superview"/>
 ?。?extension>
?。?plugin>

插件開發環境

就像你所看到的一樣,開發Eclipse程序的核心任務主要包含創建實現一個或者多個擴展的插件。理論上來說,沒有東西會阻止你使用記事本,或者vi或者命令行中的javac來開發Eclipse插件(我想聽聽嘗試過的人怎么說得?。?。幸運的是,Eclipse擁有一個強大的工具集來使這一任務變得簡單。插件開發環境PDE是作為Eclipse SDK的一個部分自由分發的,并且作為一個基于Eclipse的IDE工具的好范例而存在--它只是一些插件和它們的擴展的集合(事實上他們也留下了一些擴展點,你可以用這些擴展點來開發自己的PDE擴展)。

在PDE中,每個正在開發的插件都是被單個的Java工程所代表。插件工程具有一些獨一無二的特性來標示自己。比如說它們每一個都有一個插件描述符(一個manifest和/或一個plugin.xml文件),一個基于描述符指定的依賴關系的動態classpath,特殊的編譯器,和其他配置屬性。PDE提供了一個插件創建向導,可以選擇各種需要的部分創建插件工程。

PDE帶有一個特別的多頁編輯器來使得插件開發更加簡單。插件Manifest編輯器用到3個文件--包含的manifest(META-INF/MANIFEST.MF),plugin.xml和build.properties.它允許你編輯所有必要的屬性來描述一個插件--它的基本運行時要求,依賴,擴展,擴展點等等。當開發插件的時候你需要做更詳細的了解。

因為Eclipse插件都是Java的工程,它們缺省都是逐步構建的,不需要特別的人工編譯步驟。PDE也允許使用Ant來創建非自動編譯的插件;你可以為你的插件創建一個Ant的build腳本(在Package Explorer中,右鍵點擊你的plugin.xml并且選擇PDE Tools -> Create Ant Build File),它提供了創建多個目標輸出的方式(比如插件JAR包,源代碼包等等)。

為了測試你的工作,PDE提供了一個特別的啟動配置類型,允許你使用它的配置中包含的工作區插件來啟動另外一個工作臺實例(被稱為運行時工作臺)(也被稱作為self-hosting--你不比將你的插件安裝進一個外部的工作臺來測試它們,你可以使用自己的開發工作臺動態安裝)。你的Eclipse啟動配置將允許你指定你想包含的哪個插件,特殊的命令行參數,環境屬性等等。

PDE也有一個強大的用戶文檔和擴展參考信息(Javadoc和擴展點文檔)。因為它是和Eclipse在一個規則下分發的,所以它的代碼也是完全開放的,并且缺省包含的SDK中。
創建簡單的插件

為了對使用PDE開發插件有個更好的理解,你可以開發一個簡單的工作臺視圖。它的功能是列出運行時工作臺中所有的可用視圖(你可以稱它為超級視圖)。當你這樣做的時候,你可以使用這個身邊的例子,檢查插件Manifest編輯器的各個部分。

首先,啟動你的Eclipse SDK,選擇一個空工作區。當你關掉歡迎頁面時,你應該缺省進入Java開發模式。第一步,使用新建插件向導來創建插件。然后,使用插件Manifest編輯器編輯其描述符,并且使用JDT來實現一個Java類。最后,在一個運行時工作臺啟動插件來看效果。好,開始:

1. 在main menu中,點擊File->New->Project,然后選擇Plug-in Project并且點擊Next;

2. 在下一個向導頁中,輸入com.developer.superview作為工程名。點擊Next;

3. 在此頁中,保持所有的域為缺省值,點擊Finish。當被問到是否轉換到插件開發模式時,選擇yes。這時,插件已經被創建了,并且你可以在插件Manifest編輯器中看到總覽。

總覽頁面包含了一些一般屬性,如插件的ID,版本,名稱,提供者,插件類和平臺過濾器。它還提供了到其他頁面的鏈接,這些頁面指定了插件內容,編譯配置,和測試運行的鏈接以及導出插件(所有的和簡單描述)。ID是必須的且必須為獨一無二的。版本一般為3到4個部分組成,使用點號隔開的版本標識符(major.minor.service{.qualifier})。插件版本在你的平臺插件開發向導中有詳細記述。在這個練習里,你可以指定為缺省的1.0.0。姓名和提供者是科學院的,至是被用來在產品配置里顯示的標記。類屬性也是可選的,目前它可以被用來代表一個單獨的運行時插件實例,可以用來作為一個單獨的對多個插件特定數據的訪問點。在這個例子里,向導闖將了一個缺省的類實現,你可以在例子的任何代碼里提到它。平臺過濾器可以用來限制插件的平臺可用性(這個例子里沒有用到)。


 依賴頁面允許你指定其他一些你所依賴的插件,無論是編譯的還是運行時的。增加一個插件依賴意味著被選擇插件的所有Java包的導出,包含任何的擴展點,對你自己的代碼都是可用的。你可以選擇在你的SDK安裝時增加任何可用插件,包括你的工作臺(也就是說,其他你當前正在使用的插件)。

在我們這里例子里,你將把org.eclipse.core.runtime和org.eclipse.ui作為你的依賴。任何依賴都是可選的(確認你的代碼需要它),你可以選擇重新導入一個依賴(選擇列表中的一個插件,并且點擊屬性…)。你可以請求某個Java包對你的類啟動器可用,無論它是從何而來。這是一個高級開發主題在你的平臺文檔中有詳細敘述。這個頁面里,你可以做一些各種類型的依賴關系的分析,可以給你一個更加好的插件依賴的認識。 運行時頁面允許你指定想導出的Java包(也就是說,在你的插件列表中使你的插件可見)。在這個列表中,你無須導出任何東西,因為你不提供任何的功能作為公共API可用。如果你要這么作,拿你必須使得它們針對其衍生的插件可用(這是更加高級的開發主題了)。Classpath節是用來指定哪個類文件夾或者JAR文件應該作為你的運行時classpath,如果有多個的話(缺省只有你的插件的根目錄是被包含在它的classpath里)。

擴展頁面是你指定你所有的插件擴展的地方。它包含了一個通過你插件實現的擴展的樹(你可以從列在你的依賴的插件中選擇公布的擴展點),和一個詳細的包含反映你的當前樹選擇的域的表單。要創建新的擴展元素,右鍵點擊樹中的元素,選擇New子菜單。對元素的選擇以及每個元素的屬性集合,依賴于關聯的擴展點。你可以通過右鍵點擊樹中的擴展的方式來獲得你的擴展點文檔,然后選擇Show Description。事實上,為了繼續我們的例子,我們將為超級視圖實現增加一個新的擴展:

4. 點擊Add。在New Extension對話框中,選擇擴展點org.eclipse.ui.views。點擊Finish。

5. 右鍵點擊列表中的擴展;選擇New->category。輸入Developer.com作為名稱。

6. 右鍵點擊擴展,選擇New->view,輸入SuperView作為名稱,com.developer.superview.category1作為分類(和在上一不中創建的類型ID匹配)。

7. 點擊class鏈接。輸入Superview作為類名,點擊Finish。這將會創建一個新的實現所需接口的類,并且在Java編輯器中打開它。

你可以馬上回到視圖的開發中來?,F在,激活插件Manifest編輯器,點擊擴展點的Tab。如果可用,將會列出所有你的插件公布的擴展點。每個擴展點的細節都是可以使用擴展點方案編輯器來編輯的(這里不再詳細敘述了)。

生成頁面允許你對插件的生成配置進行指定(或者選擇自定義生成來生成一個完整的自定義的生成過程,這個你需要自己實現)。這些信息將會被增量生成器(你的工程的生成路徑也會相應的更新,這也是你不能直接更改而讓PDE來為你做的原因)和一個Ant生成腳本所使用,你只能選擇兩者中的一個。在這個聯系里,你無須特別的生成要求。若你要這樣作,比如為你的視圖使用一個自定制的圖標,你必須保證它的目錄是在二進制生成段中被檢查過的,以使得它對你的代碼在運行時可用。

MANIFEST.MF,plugin.xml,和build.properties允許你編輯相應文件的源代碼。這個只對高級熟練的Eclipse開發者推薦使用。

現在你對插件Manifest編輯器比較熟悉了,我們可以繼續我們的例子:

8. 激活Superview.java編輯器。你可以看到,為了完成視圖的實現,你必須實現最少兩個方法:createPartControl(Composite)和setFocus()。這里,我就不詳細討論底層的API了?,F在,你應該知道你要創建一個表式的可視化組件--表格查看器--來顯示你的視圖內容。你將配置它為一個內容提供者來給它操縱你的組件的能力(具體的說就是提取出你的模型結構元素來適應表格的包含),和一個標志提供者,來給予它使用適當的標志和可選圖片來轉化你的模型元素到表格項的能力。你也可以給它配置一個排序器來按照字母表順序顯示表項。最后,你給它一個輸入--你的模型對象,即運行時可用的一組所有可用視圖的描述符。完整實現如下:

Listing 2: Initial view implementation:

public class Superview extends ViewPart
{
 private TableViewer viewer;
 public void createPartControl(Composite parent)
 {
  viewer = new TableViewer(parent);
  viewer.setContentProvider(new ArrayContentProvider());
  viewer.setLabelProvider(new LabelProvider());
  viewer.setSorter(new ViewerSorter());
  viewer.setInput(PlatformUI.getWorkbench().getViewRegistry().getViews());
 }
 public void setFocus()
 {
  viewer.getTable().setFocus();
 }
}

這已經足夠運行這個例子了,保存,然后:

9. 在你的Package Explore里右鍵點擊,選擇Run As -> Eclipse Application。這將創建一個新的Eclipse使用缺省值的啟動配置,啟動它。

10. 當運行時工作臺出現的時候,你應該看到歡迎視圖。點擊Window->Show View->Other…選擇Developer.com->Superview。點擊OK。

你應該看到的是Superview顯示的形式是:視圖<視圖號>。這作為一個例子來演示PDE使用已經足夠了。然而,如果你想更深一步進入JFace的學習,你可以學著看能否把這個界面做的更加人性化一點。

在這里,表格里每條記錄代表一個工作臺視圖;你提供的模型對象作為該查看器的輸入為一組視圖的描述符(IViewDescriptor),你使用的內容提供者將任何數組對象轉化為一個它的元素列表(父子關系)。但是,標志提供者只是簡單的使用了每個元素的toString()方法來作為其標記。接口IViewDescriptor提供方法來獲得視圖標號(getLabel()),甚至可以獲得視圖的圖標圖像(getImageDescriptor())。你所要做的是重載兩個標記提供者的方法:

 11. 關閉運行時工作臺。在Superview.java編輯器中,子類new LabelProvider()如列表3所示:

Listing 3: Label provider customization:

viewer.setLabelProvider(new LabelProvider()
{
 private final Map images = new HashMap();
 public String getText(Object element)
 {
  return ((IViewDescriptor) element).getLabel();
 }
 public Image getImage(Object element)
 {
  Image image = (Image) images.get(element);
  if (image == null)
  {
   IViewDescriptor view = (IViewDescriptor) element;
   ImageDescriptor desc = view.getImageDescriptor();
   image = desc.createImage();
   images.put(element, image);
  }
  return image;
 }
 public void dispose()
 {
  for (Iterator i = images.values().iterator(); i.hasNext();) ((Image) i.next()).dispose(); super.dispose();
 }
});

這里,你已經重載了getText(Object)方法來返回元素(一個IViewDescriptor的實例)的標號。為了使得看起來更加好看,你可以重載getImage(Object)方法來返回每個視圖的文字標號的關聯圖標。這里比較復雜一點了,你必須學習JFace和SWT,你將會發現圖像(org.eclipse.swt.graphics.Image)是操作系統額資源,必須被程序來管理。然而,IViewDescriptor只是返回了一個ImageDescriptor而不是圖像本身。一個圖像標識符可能被用來創建一個Image實例,但是必須能夠在不需要的時候釋放。由于這個原因,你必須跟蹤創建的所有的Image實例并在不需要的時候釋放掉它。

要看最后的輸入,重新啟動運行時工作臺。(Ctrl + F11)


 打包并且分發插件

即使你可能完成了插件的開發和測試,你也需要將其從開發環境里導出分發到用戶手中。幸運的是,Eclipse沒有把這個交給你自己完成。你可以使用導出向導,它出現在你的插件編輯器的總覽頁面里。它將創建一個分發包文件,包含你的插件代碼和資源。用戶只要將其解壓在他們的Eclipse安裝里,如果它們的環境的所有依賴關系都滿足,那么Eclipse將會在需要時自動發現和激活你的插件。

這種形式的分發和安裝被成為未管理的--如果你將來進行更新的話,你將發現和安裝你的插件的更新的任務交給了用戶。一個更加有組織的方法時將你的插件組織成feature。feature是一組同時安裝和管理的插件。在集合插件之外,feature包含了一些信息,這些信息允許Eclipse更新管理器來定位公布的更新,并且發現新的關聯的feature。這樣的發布在某個web目錄下的更新叫做更新站點。PDE提供了向導和編輯器來支持feature和更新站點的開發。

如果你開發整個應用程序而不止是插件和feature,需要已有的基于Eclipse的產品的安裝,你需要使用產品配置編輯器(Product Configuration editor)和產品導出向導(Eclipse Product export wizard),把你的應用作為一個獨立的Eclipse產品。這個高級主題可以獨立成為一篇文章了。

結論

Eclipse是一個偉大的工具和胖客戶端應用平臺,不單提供了它的免費開放組件,頁提供了它自身的開放實現。在Eclipse中,所有功能都封裝成插件,它們一個個使用良定義的擴展點結合在一起。它的PDE提供了功能強大的工具和向導來幫助你開發你自己的插件。更重要的是,它提供了整個環節的開發支持,包括分發和后期產品維護。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97