Eclipse平台是IBM®捐赠给开源社区的开发框架,值得注意的不是因为据说IBM花了4000万美元来开发它,而是因为它们必须展示出什么支出:成熟,设计良好且可扩展的体系结构。 Eclipse的价值在于它提供了一个开放源代码平台,用于创建可扩展的集成开发环境(IDE)。 该平台允许任何人构建可与环境和其他工具无缝集成的工具。
该工具与Eclipse无缝集成的关键是插件 。 除了小型运行时内核之外,Eclipse中的所有内容都是插件。 这意味着您开发的插件与Eclipse的集成方式与其他插件完全相同。 在这方面,所有功能都是相同的。
但是,某些插件比其他插件更平等。 Workbench和Workspace是Eclipse平台上两个必不可少的插件,它们提供了大多数插件所使用的扩展点,如图1所示。一个插件需要一个扩展点才能插入。功能。
Workbench组件包含扩展点,例如,这些扩展点允许您的插件使用菜单选择和工具栏按钮扩展Eclipse用户界面,请求通知不同类型的事件并创建新视图。 工作区组件包含扩展点,使您可以与资源(包括项目和文件)进行交互。
当然,Workbench和Workspace并不是唯一可以由其他插件扩展的Eclipse组件。 此外,还有一个Debug组件,它将使您的插件启动程序,与正在运行的程序进行交互并处理错误-这是构建调试器所需的一切。 尽管对于某些类型的应用程序是必需的,但大多数应用程序不需要调试组件。
还有一个Team组件,允许Eclipse资源与版本控制系统(VCS)进行交互,但是除非您为VCS构建Eclipse客户端,否则Team组件(如Debug组件)将不会扩展或增强其功能。
最后,还有一个“帮助”组件,可用于为您的应用程序提供在线文档和上下文相关的帮助。 不可否认,帮助文档是专业应用程序中必不可少的部分,但对于插件的功能并不是必需的。
上述每个组件提供的扩展点在Eclipse平台帮助的“平台插件开发人员”指南的参考部分中进行了说明。 乍一看,尤其是在API参考的“工作台”部分,一目了然。 与其深入研究许多可用扩展点的细节,不如通过简单的插件及其组件来研究。
创建插件的最简单方法是使用插件开发环境(PDE)。 PDE与Java™开发工具(JDT)IDE一起,是Eclipse的标准扩展。 PDE提供了向导来帮助创建插件,包括我们将在此处检查的“ Hello World”示例。
从Eclipse菜单中,选择File> New> Other (或按Ctrl + N ),然后选择Select对话框左侧的Plug-in Development向导。 在“选择”对话框的右侧,选择“ 插件项目”。 按下一步。 在下一个屏幕上,输入项目名称; 我用com.example.hello
。 再次按下一步。 在下一个屏幕上,注意插件ID与项目名称相对应。 使用项目名称作为插件ID可以最大程度地减少该插件与另一个插件的名称冲突的可能性。 再次单击下一步 。 下一个屏幕使您可以选择手动创建初始插件代码或运行代码生成向导。 将代码生成向导保留为默认设置,选择Hello World并单击Next ,如图2所示。
下一个屏幕要求其他信息。 请注意此屏幕上的信息:它包括插件名称,版本号,提供程序名称和类名称。 这些是有关我们插件的重要信息,我们将在后面看到。 您可以接受向导提供的默认设置。 单击下一步。 在下一个屏幕上,接受程序包名称,类名称和消息文本的默认值。 保留标记为“将操作集添加到资源透视图”的复选框,然后单击“ 完成”。
如果通知您向导需要启用某些其他插件才能完成,请单击OK 。
稍后,向导将完成,您将在工作区中有一个名为com.example.hello的新项目,如图3所示。
在工作台的左侧,在“程序包资源管理器”中,概述了向导创建的一些内容。 大多数项目不是很有趣。 项目类路径中包含许多.jar
文件(这些文件包括插件和Java运行时所需的Eclipse类),包含工具栏按钮图形的icons文件夹以及build.properties
文件。包含自动构建脚本使用的变量。
这里最有趣的是src文件夹,其中包含我们插件的源代码和plugin.xml文件(插件的清单文件)。 我们将首先看一下plugin.xml。
插件清单文件plugin.xml包含描述性信息,Eclipse将使用它们来将插件集成到框架中。 默认情况下,首次创建插件时,清单编辑器区域中将打开plugin.xml。 编辑器底部的选项卡使您可以选择有关插件的不同信息集。 “ 欢迎”选项卡显示消息“欢迎使用Hello插件”,并简要讨论了所使用的模板以及使用Eclipse实现该插件的提示。 选择“ 源”选项卡将使您看到plugin.xml文件的完整源。
让我们看一下插件清单文件的不同部分。 首先是有关该插件的常规信息,包括其名称,版本号,实现该插件的类文件的名称以及JAR文件名。
接下来,列出了我们的插件所需的插件。
列出的第一个插件org.eclipse.core.resources是工作区插件,但是我们的插件实际上并不需要它。 第二个插件org.eclipse.ui
是工作台。 我们需要工作台插件,因为我们将扩展其两个扩展点,如后面的扩展标签所示。
第一个扩展标签具有点属性org.eclipse.ui.actionSets
。 操作集是一组插件添加到工作台用户界面中的一组贡献 ,即菜单,菜单项和工具栏。 操作集将贡献分组,以便用户可以更轻松地管理它们。 例如,由于我们在运行代码生成向导时所做的选择,我们的Hello插件的菜单和工具栏项将出现在Resource Perspective中。 用户可以使用“ 窗口”>“自定义透视图”菜单选项来更改此设置,以从要在“资源透视图”中显示的项目中删除“示例操作集”。
该操作集包含两个标签:一个菜单标签 ,用于描述项目应在工作台菜单中的位置和方式;以及一个操作标签 ,用于描述其应执行的操作-特别是,操作标签标识了执行该操作的类。 请注意,该类不同于上面列出的插件类。
许多菜单和操作属性的目的非常明显-例如,提供工具提示文本并标识工具栏项目的图形。 还要注意动作标签中的menubarPath
:此属性标识在菜单标签中定义的哪个菜单项调用在动作标签中定义的操作。 有关此和其他工作台扩展点的更多详细信息,请参阅《 平台插件开发人员指南》,尤其是“插入工作台”一章(该指南可从Eclipse的帮助菜单中获得)。
由于我们选择将插件添加到Resource Perspective中,因此生成了第二个扩展标签。 当Eclipse首次启动并加载我们的插件时,此标记使我们的插件被添加到Resource Perspective。
如果省略了最后一个扩展,则用户需要使用Window> Customize Perspective将插件添加到Resource(或其他) Perspective中 。
代码生成向导生成了两个Java源文件,您可以通过在PDE包资源管理器中打开src文件夹来查看。 第一个是HelloPlugin.java
是插件类,它扩展了AbstractUIPlugin
抽象类。 HelloPlugin
负责管理插件的生命周期,在更扩展的应用程序中,将负责维护对话框设置和用户首选项。 HelloPlugin
功能不多。
packagecom.example.hello.actions;
import org.eclipse.ui.plugin.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.resources.*;
import java.util.*;
/**
* The main plugin class to be used in the desktop.
*/
public class HelloPlugin extends AbstractUIPlugin {
//The shared instance.
private static HelloPlugin plugin;
//Resource bundle.
private ResourceBundle resourceBundle;
/**
* The constructor.
*/
public HelloPlugin(IPluginDescriptor descriptor) {
super(descriptor);
plugin = this;
try {
resourceBundle= ResourceBundle.getBundle(
"com.example.hello.HelloPluginResources");
} catch (MissingResourceException x) {
resourceBundle = null;
}
}
/**
* Returns the shared instance.
*/
public static HelloPlugin getDefault() {
return plugin;
}
/**
* Returns the workspace instance.
*/
public static IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
/**
* Returns the string from the plugin's resource bundle,
* or 'key' if not found.
*/
public static String getResourceString(String key) {
ResourceBundle bundle= HelloPlugin.getDefault().getResourceBundle();
try {
return bundle.getString(key);
} catch (MissingResourceException e) {
return key;
}
}
/**
* Returns the plugin's resource bundle,
*/
public ResourceBundle getResourceBundle() {
return resourceBundle;
}
}
第二个源文件SampleAction.java
包含执行清单文件中的操作集中指定的操作的类。 SampleAction
实现了IWorkbenchWindowActionDelegate
接口,该接口允许Eclipse为我们的插件使用代理,以便Eclipse在绝对必要之前不需要加载插件(此优化可以最大程度地减少加载插件时的内存和性能问题)。 。 IWorkbenchWindowActionDelegate
接口方法允许我们的插件与代理进行交互。
IWorkbenchWindowActionDelegate
接口方法 package com.example.hello.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(),
"Hello Plug-in",
"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;
}
}
在为Eclipse开发插件时,必须停止Eclipse,然后使用新插件重新启动它以进行测试和调试,这很尴尬。 幸运的是,Eclipse的PDE提供了一个自托管的开发环境,使您无需安装在工作台的单独实例中即可运行插件。
要运行Hello插件,请选择Run> Run As> Runtime Workbench以启动另一个Workbench实例,并添加我们插件的菜单选择和工具栏,如图5所示。
我们可以通过单击工具栏按钮或从“示例菜单”菜单中激活插件。 这两种方法都将弹出一个标题为“ Hello Plug-in”的框,其中内容为“ Hello,Eclipse world”,然后单击 “ 确定”按钮将其关闭。
我们可以通过选择Run> Debug As> Runtime Workbench来以类似的方式调试插件。 这次,我们可以在原始工作台中逐步浏览源代码,检查变量等,而插件在第二个工作台实例中运行。
一旦我们的插件经过测试并准备发布,我们将需要对其进行适当打包,以便在Eclipse中进行安装。
Eclipse通过在启动时查看其plugins目录来确定要加载的插件。 要安装插件,我们需要在plugins目录中创建一个子目录,然后将程序文件和清单文件复制到该目录中。 不必要,但是建议目录名称指示插件的ID,后跟下划线和版本号。 假设Eclipse安装在C:\ eclipse中; 我们可以建立一个目录:
C:\eclipse\plugins\com.example.hello_1.0.0.
按照Java应用程序的标准,我们的程序文件需要归档到JAR文件中-我们的插件清单文件,您可能还记得其中包含以下条目:
要创建hello.jar
文件,我们可以通过突出显示项目名称并从Eclipse菜单中选择File> Export来导出插件文件。 选择JAR文件作为目标,单击下一步 ,然后浏览到我们为其创建的目录。 接下来,我们也需要将plugin.xml文件复制到该目录。 您也可以使用“ 文件”>“导出”菜单选项(但请记住选择“文件系统”作为目标)。
这是安装插件所需的全部操作,但是您将需要停止并重新启动Eclipse才能识别新插件。 通过从帮助菜单中选择“关于Eclipse平台”,可以找到有关已安装插件的信息,包括版本号。 出现的屏幕上的按钮之一将是“插件详细信息”。 向下滚动列表以查找Hello插件及其版本号。
在目录名称中包含版本号的目的是允许插件的多个版本共存于同一台机器上(一次仅加载一个)。 我们可以通过创建Hello插件的更新版本来了解其工作原理:例如,将plugin.xml文件中的版本号更改为“ 1.0.1”,并将SampleAction.java
的文本更改为“新建并改进”。您好,Eclipse世界。” 从Eclipse菜单中选择Project> Rebuild All 。 接下来,将项目文件作为JAR导出到新的插件目录—例如com.example.hello_1.0.1
。 将修改后的plugin.xml文件复制到同一目录。 当您停止并重新启动Eclipse时,将仅加载更新的插件。
Eclipse由插件组成,但是在为Eclipse开发插件时,还需要考虑其他两个级别的组件:插件片段和功能。
顾名思义,插件片段构成了功能强大的插件( 目标插件)的一部分。 该片段提供的功能已与目标插件的功能合并。 片段可用于本地化用于不同语言的插件,可以在不需要全新版本的情况下向现有插件增量添加功能,或提供特定于平台的功能。 在许多方面,片段与插件相同。 主要区别在于片段没有插件类-片段的生命周期由其目标插件管理。 另外,片段的清单文件(称为fragment.xml)列出了目标插件的ID和版本号以及片段的ID和版本号。
另一方面,插件功能根本不包含编码。 在Eclipse体系结构术语中,功能是将一组相关的插件包装到一个完整的产品中。 例如,JDT是由插件组成的功能,例如Java编辑器,调试器和控制台。 名为feature.xml的清单文件描述了功能档案。 除其他事项外,此清单文件还包括对该功能部件包括的插件和其他资源的引用,有关如何更新该功能的信息,版权信息和许可信息。
在Eclipse中, 主要功能设置Eclipse平台的外观。 预期主要功能将确定诸如启动屏幕和其他赋予Eclipse身份的特征。 Eclipse仅允许一个主要功能。 这样,通过创建一组插件,将它们打包成一个功能部件,并使该功能部件成为主要功能部件,可以重新命名Eclipse,并将其用于创建全新的产品。 从Eclipse.org下载时,默认的主要功能是eclipse.org.platform
。
对插件的介绍必然涵盖了很少的插件可以完成的工作。 要了解有关插件的更多信息,最好的资源是Eclipse的帮助菜单中的《插件开发人员指南》 。 该文档包括编程指南,对Eclipse API和插件扩展点的引用,对Eclipse.org中可用的编程示例的指南以及常见问题列表。 另一个出色的资源是Eclipse本身的源代码。 根据您的兴趣,您可能希望找到有关如何扩展不同工作台功能(例如视图和编辑器)或如何使用SWT(Eclipse图形API)的示例。 此外,下面的“ 相关主题”可以帮助您了解更多信息。
翻译自: https://www.ibm.com/developerworks/java/library/os-ecplug/index.html