开发 Eclipse 插件
本文介绍了一套最佳实践,用于为构建在 Eclipse 平台上的应用程序开发环境开发 Eclipse 插件。本文概述的插件开发通用原则也适用于许多其他基于 Eclipse 的开发环境,以及可下载版本。本文涵盖了 Eclipse 插件开发过程的几个方面,包括视图与编辑器之争、内部或外部选择、一些标准窗口小部件工具包 (SWT) 基础知识以及 Eclipse 插件向导的实用性。本文还介绍了使用 Eclipse 开发 Eclipse 插件的优势。文章还包含一个简单应用程序插件的演练,着眼于跨多个 Eclipse 应用程序插件的重用。
在 Eclipse 中,向用户呈现任何类型信息的两种基本方式是使用视图或编辑器。视图和编辑器都允许用户通过单次或双击项目、右键单击弹出菜单或顶层下拉菜单项来选择要由插件执行的某些操作。
编辑器类几乎可以完成视图类可以完成的所有操作,以及更多功能。然而,允许所有这些额外的功能是有代价的,无论是在系统复杂性还是代码复杂性方面。通常,编辑器类比视图需要付出更多的开发精力,因此在开始编辑器实现之前必须进行一定程度的决策。
当仅需向用户提供信息并允许某些内置功能时,视图就足够了。用户通常可以使用 SWT 中的其他窗口小部件(例如表格和文本框)相对轻松地向视图输入数据。但是,如果您想要与用户进行更自由形式的交互怎么办?此外,如果您希望用户输入在多次启动 Eclipse 后仍然持久存在怎么办?
在此辩论中使用的良好通用指南是持久性问题。虽然可以从视图中将数据保留在某种持久性存储库中,但在大多数情况下,这需要在文件或类似文件的上下文中完成一些工作。如果是这种情况,通常更容易直接实现编辑器。
第二个最常见的考虑因素是实际呈现的数据。如果用户可以选择多个数据单元,并一次一个地使用它们或针对它们执行操作,则通常更容易将操作或多个操作实现为单独的视图。
在本文中,我们实现了一个示例 Eclipse 插件。此插件有一个简单的目标:向用户提供通用的应用程序级数据。这些数据将表示为字符串,尽管几乎可以替换任何数据类型。通常的左键单击、右键单击和双击操作将被启用,但只有双击被修改为所有其他操作实现的重用示例。
由于没有对持久性资源的迫切需求,并且将有多个数据实例需要一次选择一个,因此示例插件功能将作为视图实现,我们简单地将其称为 DataView。
在实现视图或编辑器时,必须做出另一个决定。数据应该在实际的 Eclipse 环境中呈现给用户,还是在环境之外以某种方式呈现?SWT 提供了 Form 类,允许您在选择时将应用程序数据外部化。
编辑器可以在外部或内部实现,但外部编辑器缺乏对插件本身的轻松访问。令人惊讶的是,现有的供应商插件正是提供了这种功能。在大多数情况下,之所以选择这样做,是因为供应商决定将用户锁定在某些级别的 Eclipse 功能之外,从而导致插件访问权限丢失。一般来说,插件编辑器的正确选择——尽管用户对工具的开放性存在争议——是在 Eclipse 内部实现编辑器。如果您不必这样做,那么失去对插件其余部分的访问权限是没有意义的。现在,视图呢?
与编辑器类似,视图也可以在外部作为单独的 Form 类实现,也可以在内部作为带有附加 SWT 窗口小部件的视图实现。这里没有硬性规定,但在处理此决定时,应遵循一些基本准则。一般来说,应考虑两件事。首先,视图数据是否可以描述为唯一且离散的实体,具有特定于该特定数据项的字段或操作?其次,这些项目是否始终少于大约九个?如果是这样,则可以将视图实现为带有表格的视图,或者可能是每个离散单元带有单独选项卡的视图。
如果数据的实际实例数和对该数据的操作类型是动态的或未知的——例如,开发人员事先不知道确切会有多少项,或者将来要设计或允许多少个不同的操作——那么最好将视图实现为外部 Form 类。
本文开发的示例插件是一个简单的 100 项实现,显示的数据对于每个项目只有两个不同的字段:名称和值。虽然没有预定义的系统要求支持九个以上的多个操作,但也没有定义显式的多个操作。因此,您可以安全地假设它也不需要太多操作——毕竟它应该是简单的。因此,DataView 插件应实现为内部视图。
要开始实际的插件开发,您需要从安装 Eclipse 开始。对于本示例,我们从 Eclipse 站点下载了撰写本文时的最新 Eclipse 版本 v3.0.2。由于我们在自己的组织中广泛使用 CDT 插件进行 C 和 C++ 开发,因此我们随后下载了 CDT v2.1 项目。可以从 Eclipse 主页上的项目链接在 Eclipse Tools Project 下访问它。您可以将这两者都下载为 .zip 文件,解压缩到 /eclipse 目录中。因此,请确保在 CDT zip 文件之前安装 Eclipse zip 文件。在我们的例子中,我们是在 Red Hat Linux 9.0 上使用 Eclipse 框架和 CDT 插件的 GTK- 版本构建的,但 Motif 版本的效果也一样好。然后我们启动了 Eclipse,使用./eclipse并从窗口→打开透视图中选择了插件开发环境 (PDE) 透视图。
许多关于 Eclipse 插件开发的文本都引导用户完成 Hello World 类型的项目。作者认为,虽然这对于新手程序员来说可能是一个好的开始,但对于经验丰富的软件开发人员来说,这绝对是开始使用 Eclipse 的最糟糕的方式。它花费的时间太长,最糟糕的是,一旦您需要创建真正的插件,就必须重做大部分工作。相反,我们通常建议创建尽可能完整的插件项目,并尽可能多地使用环境允许的预先存在的模板。这样做可以立即为您提供相当多的功能。然后,您可以开发对现有功能的自定义,而无需担心是否正确连接或挂钩到正常的插件类型环境。
在 PDE 中,插件向导允许开发人员通过简单地选择文件→新建→插件项目来快速轻松地创建示例插件项目。当提示输入插件名称时,我们使用其他商业供应商常用的语法。也就是说,我们将插件命名为 com.companyName.productName,或者在本例中命名为 com.mcc.dataView,如图 1 所示。
一旦我们开始进行一些实际的自定义,从插件项目中删除功能就很容易了,因此我们选择“下一步”两次屏幕,直到到达“模板”屏幕。然后,我们选择“使用模板框之一创建插件”,并选择使用“自定义插件向导”。然后,您选择“下一步”以查看要创建的模板。
您可以在此时删除特定功能,但对于本练习,我们保留所有功能,并且只需继续选择“下一步”,直到到达“主视图设置”窗口。在此窗口中,我们将“示例视图”重命名为“数据视图”,如图 2 所示。在您适当地修改此窗口后,您可以选择“完成”或循环浏览最后一个自定义部分,即“视图功能”。在此过程中,您可以前进和后退,因此请慢慢来。在选择“完成”按钮之前,不会对环境进行任何更改。
如果您第一次搞砸了,就像作者一样,请毫不犹豫地删除整个项目,包括目录内容,然后重新开始,直到您做对为止。一旦插件已根据您的确切模板规范创建,您就可以首次执行该插件了。为此,我们使用运行时工作台。
Eclipse 框架最吸引人的功能之一是它自身能够在运行时工作台中开发、测试、调试和执行插件。很少有开发环境以如此易于使用和直观的方式提供完全相同的功能。这消除了许多浪费时间的障碍,这些障碍阻碍了开发人员陷入其他开发环境典型的漫长编译-构建-调试周期。
要执行 DataView 插件,只需从 PDE 透视图中选择“运行”→“运行方式”→“6 运行时工作台”。Eclipse PDE 生成一个完全独立的用户工作区,称为运行时工作区,并执行 DataView 插件。在首次执行插件时,您需要选择“窗口”→“显示视图”→“其他”顶层菜单下拉菜单,然后选择在插件创建期间选择的特定“视图”标题下列出的 DataView。
在未来的执行中,运行时工作台的功能与常规工作区的功能非常相似,并在多次启动之间保留适当的视图布局。这大大简化了测试,因为重新测试只是再次运行运行时工作台的问题。
运行时工作台模型的少数缺点之一是,由于在一台机器上执行相当于两个 Eclipse 会话的操作,导致主机 RAM 使用量大致翻倍。在 RAM 有限的系统中,例如笔记本电脑环境,这可能会有点慢且令人沮丧。但是,随着 JVM 的改进,这个问题确实有所好转。
试用示例插件菜单和下拉菜单,以了解您创建的功能。即使我们在本文中没有讨论编辑器自定义,您也可能想尝试创建一个简单的 Eclipse 项目,然后创建一个扩展名为 .mpe 的新文件。这样做可以让您熟悉多页编辑器的概念,类似于用于显示 plugin.xml 文件的编辑器,该文件现在列在您的新插件项目下。
自定义 DataView 的第一步是在 Views 文件夹下的插件项目中添加一个新的 ViewLabelProvider 类。这允许您在插件执行时将数据添加到 DataView 窗口中显示的表格中。ViewLabelProvider 通过将存储在那里的数据(名称和值)提供给 DataView,与 ParameterControl 类进行交互。可以在项目 tar 文件中找到此类的完整列表。
自定义 DataView 的下一步是将 ViewLableProvider 类引用的 ParameterControl 类添加到 Views 文件夹下的插件项目中。此类维护要在 DataView 表格中显示的实际参数名称和值。虽然这是一个相对简单的实现,但如果需要,它可以很容易地扩展到更多字段。也可以在项目 tar 文件中找到此类的完整列表。
自定义 DataView 的第三步是将具有适当设置的表格添加到 DataView 类(请参阅 Linux Journal FTP 站点上的列表 1),修改插件类本身以支持 UserParameter 变量,并自定义 DoubleClick 操作以显示表格条目数据。请注意,添加了一个名为 UpdateTheTable 的新函数,该函数向表格提供最新数据。此函数将是通过文件系统或网络或其他方式获取新应用程序数据的修改点。仅对于此示例,前四个参数被修改为新数据。我们插件的完整代码可从 Linux Journal FTP 站点获得(请参阅在线资源)。
最后的修改是将 ParameterControl 变量及其初始化添加到插件本身。这是通过将变量声明添加到 DataViewPlugin.java 文件中,在声明 resourceBundle 之后的第一个点处完成的。变量声明应如下所示
//User Parameter functionality public ParameterControl userParameters[] = new ParameterControl[100];
接下来,初始化部分添加到插件构造函数的末尾,如下所示
// Additions for User Parameter functionality int index; for (index = 0; index < 100; index++) { userParameters[index] = new ParameterControl("Parameter " + (index + 1), "Value " + (index + 1)); }
插件的最终运行时工作台执行如图 3 所示。在图中,用户双击了一个项目,生成了一个简单的用户对话框,其中显示了所做表格选择的实际数据。
在本文中,我们发现了一些基本规则,在决定 Eclipse 插件应如何通过 Eclipse 视图向用户呈现应用程序数据时应遵循这些规则。我们利用 Eclipse 插件向导以可测试和可重用的格式自动生成了大部分插件初始化代码。我们还回顾了 SWT 的某些用法示例,包括表格、查看器和标签提供器,以及它们在用户视图上下文中的用途。最后,我们了解了使用 Eclipse 运行时工作台功能的一些优点和缺点。
在此过程中,我们创建了一个相对简单的示例插件,可以一遍又一遍地用作新 Eclipse 插件的起点。示例插件通过启用所有典型的插件功能(例如多页编辑器、属性、向导和引用扩展),轻松适应插件本身的未来增长。现在可以以迭代方式实现此附加插件功能,不仅允许特定插件的未来增长,而且更易于跨多个插件开发重用。它还可以作为对 Eclipse 开发知之甚少或一无所知的新开发人员的起点。这种可重用性方面是 Eclipse 框架最引人注目的功能之一。
本文资源: /article/8789。
Mike McCullough 是 MCC Systems, Inc. 的总裁兼首席执行官。Mike 拥有波士顿大学计算机工程学士学位和系统工程硕士学位。作为一名拥有 20 年电子行业经验的资深人士,他曾在 Wind River Systems、Lockheed Sanders、Stratus Computer 和 Apollo Computer 担任过各种职位。MCC Systems 是面向嵌入式市场的基于 Eclipse 的软件开发工具、培训和咨询服务提供商。