Eclipse插件終極攻略:安裝實(shí)例
本文為日文文獻(xiàn)《Eclipse 3.4 対応 Eclipse 3.4 プラグイン開発 徹底攻略》第二部分的譯文,在前文中給各位午飯奉獻(xiàn)了《Eclipse插件***攻略:基本概念介紹》,在這個(gè)部分里我們將講一下“Eclipse插件開發(fā)安裝實(shí)例”。
51CTO推薦專題:Eclipse平臺(tái)應(yīng)用與開發(fā)詳解
1.生成插件工程
通過選擇[文件]->[新建]->[工程...]啟動(dòng)[新工程(New Project)]向?qū)?。在插件開發(fā)的時(shí)候我們就不能選擇通常的java工程了,要選擇新建一個(gè)插件工程。
選擇[插件工程(Plug-in Project)]后點(diǎn)擊[下一步(Next)](圖2-1)。下一步,輸入一個(gè)適當(dāng)?shù)捻?xiàng)目名(圖2-2)。習(xí)慣上項(xiàng)目名和插件的ID是相同的。插件ID和java包的命名方式相同,必須一個(gè)世界范圍***的名稱。在這里用cn.sf.amateras.sample作為項(xiàng)目名稱(=插件ID)。點(diǎn)擊[下一步(Next)]。
圖2-1 生成插件工程
圖2-2 輸入插件信息
輸入[插件ID]、[插件版本]、[插件屬性(插件作者)](圖2-3)等信息。[插件ID]會(huì)被自動(dòng)設(shè)成之前輸入的[工程名]。沒有其他特別的設(shè)定的話繼續(xù)點(diǎn)擊[下一步(Next)]。
圖2-3 輸入生成工程必要的信息
圖2-4 模板選擇
圖2-5 輸入模板信息
根據(jù)選擇的模板生成的插件在(圖2-5)的畫面可以修改一些信息。如果沒有特別需要設(shè)定的地方點(diǎn)擊[完成(Finish)],生成工程。
PDE透視圖
插件工程生成后,就會(huì)切換到PDE(插件開發(fā))透視圖。工程此時(shí)根據(jù)選擇的[Hello,World]模板生成了插件的源代碼,并且打開了manifest編輯器。
圖2-6 PDE(插件開發(fā))透視圖
#p#
2. 插件的動(dòng)作
接下來我們看一下插件的動(dòng)作。manifest編輯器的[概要]頁面右側(cè)[啟動(dòng)Eclipse應(yīng)用(Luanch an Eclipse application)](圖2-7)。點(diǎn)擊后,會(huì)啟用一個(gè)新的Eclipse實(shí)例。這個(gè)新的實(shí)例被稱為[運(yùn)行時(shí)工作臺(tái)]。運(yùn)行工作臺(tái)可以以嵌入當(dāng)前正在開發(fā)的插件的狀態(tài)啟動(dòng),以使開發(fā)者可以對(duì)插件的動(dòng)作進(jìn)行確認(rèn)。
圖2-7 啟動(dòng)運(yùn)行時(shí)工作臺(tái)
啟動(dòng)的運(yùn)行時(shí)工作臺(tái),會(huì)在菜單欄上增加一個(gè)新的菜單項(xiàng)。這個(gè)菜單項(xiàng)就是插件的代碼追加上去的。在工具欄上也增加了一個(gè)相應(yīng)的按鈕。
工具欄上的按鈕和菜單項(xiàng)目效果相同,都會(huì)出現(xiàn)一個(gè)[Hello,Eclipse World]的對(duì)話框。
Eclipse版的Hello World就完成了。確認(rèn)完這些動(dòng)作后,就可以關(guān)閉當(dāng)前的運(yùn)行時(shí)工作臺(tái)了。
圖2-8 示例中新增的菜單項(xiàng)和工具欄按鈕以及相應(yīng)的動(dòng)作
MANIFEST.MF和plugin.xml
一個(gè)插件包含MANIFEST.MF和plugin.xml兩個(gè)配置文件。MANIFEST.MF是OSGi的handler配置文件,記錄了插件ID、名稱、作者、和其他插件的依賴關(guān)系等。plugin.xml記錄了插件的擴(kuò)展和擴(kuò)展點(diǎn)的定義等信息。
Eclipse3.1以前由于還沒有采用OSGi技術(shù),插件的所有信息都記錄在plugin.xml里。所以應(yīng)用在Eclipse3.1以前版本的插件如果要應(yīng)用于Eclipse3.1和以后版本時(shí)要注意遵守OSGi的配置文件定義規(guī)范。
#p#
3. PDE的功能
PDE(插件開發(fā)環(huán)境·Plugin Development Enviromment)提供了插件開發(fā)的各種功能。因?yàn)椴寮拈_發(fā)使用java語言,所以也會(huì)使用到j(luò)ava編碼工具JDT。
Manifest編輯器
PDE提供的功能中最重要的就是Manifest編輯器。編輯器可以為插件的兩個(gè)配置文件提供圖形化的編輯功能。
編輯器的配置項(xiàng)目非常多,可以通過編輯器下面的tab頁切換設(shè)定畫面。
圖2-9 Manifest編輯器
表1 Manifest編輯器各tab頁
頁面 | 說明 |
Overview | 可以設(shè)定插件的概要信息。生成用于發(fā)布的文檔以及啟動(dòng)運(yùn)行時(shí)工作臺(tái)。 |
Dependencies | 設(shè)定插件間的依賴關(guān)系。 |
Runtime | 可以設(shè)置導(dǎo)出包和ClassPath。 |
Extensions | 管理當(dāng)前插件對(duì)擴(kuò)展點(diǎn)的擴(kuò)展。 |
Extension Points | 管理當(dāng)前插件的擴(kuò)展點(diǎn)。 |
Build | 生成工程時(shí)的各種設(shè)定。 |
MANIFEST.MF | 顯示MANIFEST.MF的源代碼 |
plugin.xml | 顯示plugin.xml的源代碼 |
build.properties | 顯示build.properties的源代碼 |
在Overview以外的tab頁上部會(huì)顯示一些快捷鍵按鈕,使用這些按鈕也可以進(jìn)行啟動(dòng)運(yùn)行時(shí)工作臺(tái),導(dǎo)出等操作。
圖2-10 編輯器上部
下面介紹一下PDE題供的幾種視圖。在[Window]->[Show View]中可以找到?jīng)]有被顯示的視圖。
[插件(Plug-ins)]視圖
所有的插件列表,包含當(dāng)前工作區(qū)內(nèi)正在開發(fā)的插件。打開插件節(jié)點(diǎn)可以顯示插件下包含的資源,但是以jar包提供出來的插件就顯示不出來了。
在插件節(jié)點(diǎn)上點(diǎn)擊右鍵選擇[打開依賴關(guān)系(Open Dependencies)]可以打開后面要介紹的[依賴關(guān)系]視圖,表現(xiàn)插件間的依賴關(guān)系。右鍵菜單中也可以把選中的插件作為一個(gè)工程引入到當(dāng)前工作區(qū)內(nèi)。
[依賴關(guān)系(Plug-in Dependencies)]視圖
表現(xiàn)了插件間的依賴關(guān)系??梢苑謩e表示當(dāng)前插件依賴的插件和依賴當(dāng)前插件的插件。
[插件注冊(cè)(Plug-in Registry)]視圖
當(dāng)前工作臺(tái)加載的所有插件列表。打開插件節(jié)點(diǎn),顯示插件提供的擴(kuò)展和擴(kuò)展點(diǎn)、依賴關(guān)系等。
[錯(cuò)誤Log(Error Log)]視圖
錯(cuò)誤Log視圖雖然不是PDE提供的功能,但是在插件開發(fā)的時(shí)候非常有用。它可以表現(xiàn)當(dāng)前工作臺(tái)內(nèi)發(fā)生的錯(cuò)誤,并且在錯(cuò)誤上雙擊既可以導(dǎo)向到錯(cuò)誤發(fā)生的地方。
Plugin-in Selection Spy
同時(shí)按下alt+shift+F1
Plugin-in Selection Spy是從Eclipse3.4開始加入的新功能,能夠顯示當(dāng)前焦點(diǎn)所在的編輯器、視圖、向?qū)?、?duì)話框等的內(nèi)部信息。把已有的插件作為參考,進(jìn)行插件開發(fā),使用這個(gè)功能是再合適不過了。
#p#
4. 解讀示例插件的代碼
讓我們回到插件工程來,看一看插件工程生成的代碼。首先看一下plugin.xml的代碼。
代碼2-1 plugin.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <?eclipse version="3.4"?>
- <plugin>
- <extension
- point="org.eclipse.ui.actionSets"> ①
- <actionSet
- label="Sample Action Set"
- visible="true"
- id="cn.sf.amateras.sample.actionSet">
- <menu
- label="Sample &Menu"
- id="sampleMenu">
- <separator
- name="sampleGroup">
- </separator>
- </menu>
- <action
- label="&Sample Action"
- icon="icons/sample.gif"
- class="cn.sf.amateras.sample.actions.SampleAction"
- tooltip="Hello, Eclipse world"
- menubarPath="sampleMenu/sampleGroup"
- toolbarPath="sampleGroup"
- id="cn.sf.amateras.sample.actions.SampleAction">
- </action>
- </actionSet>
- </extension>
- </plugin>
為了在菜單欄增加一個(gè)項(xiàng)目,文件中使用了extension元素。①的id指定了擴(kuò)展點(diǎn)的名稱org.eclipse.ui.actionSets。extension里的內(nèi)容根據(jù)擴(kuò)展點(diǎn)而不同。示例插件中包含了actionSet、menu、action等元素。
②中的class屬性指定了cn.sf.amateras.sample.actions.SampleAction類作為響應(yīng)菜單或者工具欄按鈕的action類。
代碼2-2 SampleAction.java
- package cn.sf.amateras.sample.actions;
- import org.eclipse.jface.action.IAction;
- import org.eclipse.jface.viewers.ISelection;
- import org.eclipse.ui.IWorkbenchWindow;
- import org.eclipse.ui.IWorkbenchWindowActionDelegate;
- import org.eclipse.jface.dialogs.MessageDialog;
- /**
- * Our sample action implements workbench action delegate.
- * The action proxy will be created by the workbench and
- * shown in the UI. When the user tries to use the action,
- * this delegate will be created and execution will be
- * delegated to it.
- * @see IWorkbenchWindowActionDelegate
- */
- public class SampleAction implements IWorkbenchWindowActionDelegate {
- private IWorkbenchWindow window;
- /**
- * The constructor.
- */
- public SampleAction() {
- }
- /**
- * The action has been activated. The argument of the
- * method represents the 'real' action sitting
- * in the workbench UI.
- * @see IWorkbenchWindowActionDelegate#run
- */
- public void run(IAction action) { //......①
- MessageDialog.openInformation(
- window.getShell(),
- "Sample",
- "Hello, Eclipse world");
- }
- /**
- * Selection in the workbench has been changed. We
- * can change the state of the 'real' action here
- * if we want, but this can only happen after
- * the delegate has been created.
- * @see IWorkbenchWindowActionDelegate#selectionChanged
- */
- public void selectionChanged(IAction action, ISelection selection) {
- }
- /**
- * We can use this method to dispose of any system
- * resources we previously allocated.
- * @see IWorkbenchWindowActionDelegate#dispose
- */
- public void dispose() {
- }
- /**
- * We will cache window object in order to
- * be able to provide parent shell for the message dialog.
- * @see IWorkbenchWindowActionDelegate#init
- */
- public void init(IWorkbenchWindow window) {
- this.window = window;
- }
- }
①run()方法內(nèi)記錄了action執(zhí)行時(shí)的處理。利用MessageDialog.openInformation方法打開了一個(gè)對(duì)話框。
咱們?cè)倏纯瓷傻牧硗庖粋€(gè)類--Activator類。這個(gè)類對(duì)插件的生命周期進(jìn)行了管理,被稱為插件類。
代碼2-3 Activator.java
- package cn.sf.amateras.sample;
- import org.eclipse.jface.resource.ImageDescriptor;
- import org.eclipse.ui.plugin.AbstractUIPlugin; //....①
- import org.osgi.framework.BundleContext;
- /**
- * The activator class controls the plug-in life cycle
- */
- public class Activator extends AbstractUIPlugin {
- // The plug-in ID
- public static final String PLUGIN_ID = "cn.sf.amateras.sample"; //$NON-NLS-1$
- // The shared instance
- private static Activator plugin;
- /**
- * The constructor
- */
- public Activator() {
- }
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
- */
- public void start(BundleContext context) throws Exception {//....③
- super.start(context);
- plugin = this;
- }
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
- */
- public void stop(BundleContext context) throws Exception {//....④
- plugin = null;
- super.stop(context);
- }
- /**
- * Returns the shared instance
- *
- * @return the shared instance
- */
- public static Activator getDefault() {//....②
- return plugin;
- }
- /**
- * Returns an image descriptor for the image file at the given
- * plug-in relative path
- *
- * @param path the path
- * @return the image descriptor
- */
- public static ImageDescriptor getImageDescriptor(String path) {
- return imageDescriptorFromPlugin(PLUGIN_ID, path);
- }
- }
示例中的插件類繼承自AbstractUIPlugin(①)。如果沒有UI的插件繼承AbstractUIPlugin的父類Plugin就可以了。
插件類的方法如下表所示:
getDefault() | 取得插件類的實(shí)例的方法。插件類是單例的,所以這個(gè)方法作為一個(gè)靜態(tài)方法提供。 |
start() | 插件開始時(shí)的處理。 |
stop() | 插件停止時(shí)的處理。 |
getLog() | log輸出時(shí)取得ILog用的方法。 |
getImageRegistry() | 取得管理插件內(nèi)圖像的ImageRegistry類。 |
getPerferenceStore() | 取得保存插件設(shè)定的IPerferenceStore類。 |
getDialogSettings() | 取得保存對(duì)話框設(shè)定的IDialogSettings類。 |
getWorkbench() | 取得IWorkbench的實(shí)例。 |
以上就是根據(jù)[Hello World]模板生成的插件的代碼講解,在PDE中為我們準(zhǔn)備了很多的模板,大家可以都試試看。
感謝大家關(guān)注51CTO《Eclipse插件開發(fā)基礎(chǔ)教程:***攻略》。如果您對(duì)Eclipse有什么新的使用心得可以發(fā)Email:zhousn@51cto.com,51CTO將與您一起分享!
【編輯推薦】