亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

開發Eclipse插件

2019-11-18 11:20:32
字體:
來源:轉載
供稿:網友

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中,選擇用向導模板生成一個缺省的插件,如圖六:



圖六


這個用缺省方式生成的插件類對于我們將要的代碼并不是必需的,也可以用生成空插件的方式建立我們的項目,這樣做只是為進一步說明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的資源總站。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品久久7777777| 欧美激情图片区| 久久久久久久久久亚洲| 91人人爽人人爽人人精88v| 精品无人区乱码1区2区3区在线| 色噜噜狠狠狠综合曰曰曰| 欧美一级电影在线| 97人人做人人爱| 高跟丝袜欧美一区| 亚洲嫩模很污视频| 亚洲二区中文字幕| 亚洲视频网站在线观看| 亚洲老头老太hd| 精品久久香蕉国产线看观看gif| 中文字幕欧美日韩| 久久精品国产久精国产一老狼| 久久久欧美一区二区| 国产精品免费久久久久影院| 欧美激情在线播放| 国产剧情久久久久久| 中文字幕久精品免费视频| 久久久91精品国产| 91精品视频在线播放| 国产精品va在线播放我和闺蜜| 久久在线免费视频| 亚洲男女自偷自拍图片另类| 久久伊人精品一区二区三区| 亚洲精品美女久久久久| 亚洲免费小视频| 亚洲精品电影久久久| 亚洲精品国产福利| 国产精品爱久久久久久久| 亚洲free性xxxx护士hd| 成人福利视频在线观看| 亚洲美女精品久久| 中文字幕亚洲无线码在线一区| 欧美日韩国产综合视频在线观看中文| 国产精品久久久久久久天堂| 97碰碰碰免费色视频| 亚洲国产一区二区三区在线观看| 亚洲欧美国产高清va在线播| 国产精品久久久久久久久久久久| 欧美性视频网站| 色婷婷**av毛片一区| 精品国产乱码久久久久久虫虫漫画| 亚洲久久久久久久久久久| 久久视频精品在线| 伊人伊成久久人综合网小说| 久久免费少妇高潮久久精品99| 亚洲人成网站777色婷婷| 日韩免费在线看| 国产精品视频成人| 国产精品第七影院| 国产精品久久久久久av| 精品香蕉一区二区三区| 欧美亚洲成人免费| 久久久国产视频| 精品爽片免费看久久| 欧美极品第一页| 亚洲国产第一页| 免费不卡欧美自拍视频| 国产精品高潮视频| 中文字幕久久久av一区| 欧美性69xxxx肥| 欧美最近摘花xxxx摘花| 51视频国产精品一区二区| 久久久噜噜噜久久久| 亚洲男人第一网站| 久久九九亚洲综合| 亚洲欧洲黄色网| 国产成人精品视频在线观看| 亚洲精品v天堂中文字幕| 亚洲一区中文字幕| 亚洲欧美日韩另类| www.欧美精品一二三区| 国产91色在线播放| 亚洲情综合五月天| 欧美日韩午夜视频在线观看| 久久99久久99精品中文字幕| 久久在线视频在线| 久久av红桃一区二区小说| 国产精品女主播| 国产精品入口日韩视频大尺度| 国产精品日韩在线观看| 亚洲欧洲国产精品| 日韩av最新在线| 亚洲毛片一区二区| 中文字幕自拍vr一区二区三区| 亚洲人成免费电影| 亚洲国产天堂网精品网站| 国产一区二区三区视频在线观看| 日韩精品久久久久久福利| 国产欧美日韩丝袜精品一区| 欧美在线视频免费观看| 亚洲一区久久久| 在线日韩精品视频| 2024亚洲男人天堂| 国产精品欧美日韩一区二区| 欧美大片大片在线播放| 亚洲va男人天堂| 欧美第一黄色网| 欧美伊久线香蕉线新在线| 91精品国产网站| 最近2019中文字幕在线高清| 俺去亚洲欧洲欧美日韩| 欧美日本啪啪无遮挡网站| 国产精品爽爽ⅴa在线观看| 91精品啪在线观看麻豆免费| 欧美精品videosex性欧美| 日韩电影第一页| 国产精品第100页| 日韩免费观看网站| 日韩一区二区三区国产| 国产成人精品午夜| 欧洲永久精品大片ww免费漫画| 国产一区二区三区视频| 一区二区三区四区在线观看视频| 狠狠综合久久av一区二区小说| 51色欧美片视频在线观看| 亚洲国产精品一区二区久| 久久久免费电影| 亚洲在线一区二区| 国产精品久久久久久久久免费看| 久久黄色av网站| 欧美日韩另类在线| 色偷偷88888欧美精品久久久| 亚洲人午夜精品| 亚洲欧美制服中文字幕| 欧美福利视频在线观看| 国产亚洲视频中文字幕视频| 成人精品视频99在线观看免费| 欧美最近摘花xxxx摘花| 国产日韩欧美夫妻视频在线观看| 在线播放日韩专区| 亚洲iv一区二区三区| 国产精品小说在线| 午夜精品蜜臀一区二区三区免费| 国产精品久久一区| 日韩精品免费综合视频在线播放| 8090理伦午夜在线电影| 日韩精品欧美国产精品忘忧草| 欧美精品久久久久久久| 欧美午夜丰满在线18影院| 成人在线精品视频| 亚洲男子天堂网| 国产精品入口尤物| 国产精品视频999| 欧美电影免费观看电视剧大全| 亚洲人成电影网站| 亚洲xxxx18| 国产亚洲欧美另类中文| 国产精品一二三在线| 国产亚洲精品成人av久久ww| 国产精品a久久久久久| 国产精品欧美日韩一区二区| 成人精品网站在线观看| 中文字幕日韩综合av| 91精品久久久久| 亚洲自拍偷拍福利| 色噜噜久久综合伊人一本| 国产精品国产三级国产专播精品人| 57pao精品| 欧美性videos高清精品| 久久国内精品一国内精品|