尽管没有先决条件,但是如果您下载、安装并配置 Eclipse 3.0、1.4 Java 虚拟机和 Apache Ant,将会发现本教程还是很容易理解的。如果没有安装这些工具,请引用、下载并安装下列资源:
- Eclipse 3.0 可以从 http://www.eclipse.org/downloads/index.php 中获得。
- Java 2 标准版,软件开发包(SDK)可以从 http://java.sun.com/j2se/1.4.2/download.html 中获得。
- Apache Ant 1.6.1 可以从 http://ant.apache.org/ 中获得。
什么是 RCP?
在浏览器大战的日子里,许多开发人员和用户都对桌面 Web 浏览器缺乏创新和进步而感到失望。尽管 Web 浏览器允许机构为大量的用户部署后台办公应用程序,但试图提供支持多个操作系统上的多个浏览器的可用接口,将加重开发人员和管理人员的负担。RCP (Rich Client Platform)是一个令人激动的概念,它寻求满足对单一跨平台环境的需要的解决方法,以创建高交互性商业应用程序。
实质上,RCP 提供了一个通用的 Eclipse 工作台,开发人员可以扩展该工作台来构造自己的应用程序。一个应用程序至少包括一个定制插件,并且可以使用与 Eclipse 3.0 IDE 相同的用户界面元素。在转向对如何创建插件的讨论之前,应该让您自己熟悉一下 Eclipse 用户界面的基本元素,如图 1 所示。
图 1. Eclipse 用户界面的基本元素
该环境的基本元素包括:
- Workbench(工作台) —— 用于所有窗口的拱形容器。
- Perspective(透视图) —— 用于所有已打开的视图和编辑器的可视化容器。
- View(视图) —— 显示特定类型资源的可视化容器。 通常,一个视图包括一个数据网格或者树结构。在图 1 中, 任务视图是一个视图实例,可以在 Java 透视图中使用它。
- Short Cut Bar(快捷方式栏) —— 图标的集合,允许用户快速访问不同的透视图。
- Menu Bar(菜单栏) —— 内容敏感动作的集合,为用户提供执行某些预定义功能的能力。
- Tool Bar(工具栏) —— 内容敏感动作的集合,允许用户执行某些预定义的功能。在工具栏中发现的所有项都显示在菜单栏中。
- Editor(编辑器) —— 编辑器是用户显示和操作数据的主要工具。在 Eclipse IDE 环境中,开发人员使用编辑器编辑 Java 源代码。
标准窗口小部件工具箱和 JFace
如果查看组成 Eclipse 平台的源代码,你会注意到,它并没有使用 Java 标准窗口小部件工具箱。在 Eclipse 平台开发期间,该项目产生两个用户界面工具箱,您可以在 Eclipse 项目以外的地方使用它们。这些工具箱包括:
- 标准窗口小部件工具箱(Standard Widget Toolkit,SWT) —— SWT 提供一个与平台无关的 API,并与操作系统的本地窗口环境紧密集成。SWT 的方法向 Java 开发人员提供了一个跨平台的 API,用于实现“感觉上”类似于本地桌面应用程序的解决方案。该工具箱克服了开发人员在使用 Java 抽象窗口小部件工具箱(AWT)或者 Java 基础类(JFC)时面临的许多设计和实现权衡。
- JFace —— JFace 工具箱是一个与平台无关的用户界面 API,它扩展了 SWT,并能与 SWT 交互操作。该库提供了一个组件集合和帮助者工具,在开发 SWT 用户界面时,可以用它来简化许多公共任务。该工具箱包括许多工具类,它们扩展 SWT 来提供数据观察器、向导和对话框组件、文本操作,以及图像和字体组件。
在开发 RCP 应用程序期间,可以大量使用 SWT 和 JFace 类。
实现 RCP 应用程序的步骤
在介绍在 Eclipse 内部开发 RCP 应用程序的细节之前,我们来回顾一下实现这种类型项目的一般性步骤。
- 确定扩展点。
- 定义插件清单。
- 实现扩展。
- 定义
WorkbenchAdvisor
类。 - 定义
Application
类。 - 导出应用程序。
使用插件开发环境
Eclipse IDE 的组件之一是一个称为插件开发环境(Plug-in Development Environment,PDE)的特定透视图。该透视图为您提供了创建和包装定制 Eclipse 插件或者 RCP 应用程序所需要的所有东西。您可以通过实现下列步骤来访问该透视图:
- 从您的工作站上启动 Eclipse 3.0。
- 从菜单栏选择 Window > Open Perspective > Other。该动作将通过选择透视图对话框来提示您如何操作,如图 3 所示:
图 3. 选择透视图对话框
- 从透视图列表选择 Plug-in Development,然后点击 OK ,出现 PDE 透视图,如图 4 所示:
图 4. PDE 透视图
创建项目
利用在 Eclipse 中打开的 PDE 透视图完成下列步骤,以创建一个新的项目:
- 从菜单栏选择 File > New > Plug-in Project ,以显示 New Plug-in Project 向导,如图 5 所示:
图 5. New Plug-in Project 向导
- 在 Project name 字段内键入 Google。
- 保存该页的默认值并点击 Next ,继续查看插件内容页面,如图 6 所示:
图 6. 插件项目内容页面
- 在 Class Name 字段中键入 com.ibm.developerworks.google.GooglePlugin,然后点击 Next ,出现模板页面。
- 保存该模板页面的默认值,然后点击 Finish。
理解插件清单
在您完成 New Plug-in Project 向导之后,就将一个称为 Google 的项目添加到了包浏览器中,出现一个标题为“Overview”的页面,如图 7 所示。图 7. Welcome to Google Plug-in
该页面是一个用来编辑已生成插件清单的强大工具。插件清单负责定义资源、依存关系和 Eclipse 运行时将要管理的扩展。所有项目的插件清单都位于该项目的根目录内,该目录名为 plugin.xml。编辑器底部的每个标签都向您提供了一个访问和操作该文件的特定部分的简便方法。
plugin.xml 标签允许您观察编辑器生成的每个部分的 XML。例如,下面您将看到 New Plug-in Project 向导最初生成的插件清单的内容。
<? xml version="1.0" encoding="UTF-8" ?>
<? eclipse version="3.0" ?>
< plugin
id ="Google"
name ="Google Plug-in"
version ="1.0.0"
provider-name =""
class ="com.ibm.developerworks.google.GooglePlugin" >
< runtime >
< library name ="Google.jar" >
< export name ="*" />
</ library >
</ runtime >
< requires >
< import plugin ="org.eclipse.ui" />
< import plugin ="org.eclipse.core.runtime.compatibility" />
</ requires >
</ plugin >
在进行本文的讨论期间,主要使用 plugin.xml 视图来编辑插件清单。尽管对于了解插件清单的结构来说,编辑器是一个很有用的工具,但是您必须了解它生成的一些标签,以及它们是如何帮助构成完整的插件的。接下来的两组讨论回顾了插件清单的每个标签,并解释了它们的用途。
要创建基本的 RCP 应用程序,则需要向清单中添加一些额外的内容。通过使用插件清单编辑器的 plugin.xml 标签,在编辑器内部修改 XML,从而反映下列变化:
从
<plugin>
元素开始,第 3 至 8 行定义了插件清单的主体。这个基础标签包括该插件的所有扩展、扩展点、依存关系和运行时约束。而且,<plugin>
标签具有下列 5 个属性:name
—— 该属性定义了插件的一般名称。id
—— 该属性为插件定义了一个惟一标识符。为了减少任何命名冲突,您应该从插件作者的 Internet 域名导出该属性。在该实例中,实例的 id 已经被改为com.ibm.developerworks.google
。该实践与其他的 Java 命名约定是一致的,例如类的包装。version
—— 该属性以 major.minor.service 的格式定义了插件的版本。provider-name
—— 该属性定义了插件的作者。class
—— 该属性定义了插件类的名称。尽管定义了插件类,但 RCP 应用程序在执行期间并不使用该类。
第 10 至 14 行定义了插件清单的运行时部分。与 Java 应用程序中类路径的概念类似,这部分定义了在执行期间所必需的所有本地 Java 库。可以通过使用
<library>
元素将每一个 Java 库列在<runtime>
元素中。该 library 元素可以包括一系列嵌套的<export>
元素。每个 export 元素都为该特定库定义了导出掩码。第 16 至 19 行包含一个
<requires>
元素,该元素定义了对其他插件的所有依存关系。可以通过使用单个<import>
元素逐条列举每个插件。第 21 至 37 行定义了 RCP 应用程序将使用的两个
<extension>
元素。下面一组讨论回顾了扩展和扩展点的基本概念。<extension>
元素具有下列三个属性:point
—— 该属性定义了对正在进行配置的扩展点的引用。id
—— 该可选属性为扩展点配置实例定义了一个标识符。name
—— 该可选属性为扩展定义了一个一般名称。
Eclipse 平台使用了一个相对较小的运行时核心和一个精致的插件体系结构,因此,它是高度可扩展的。可以通过使用插件为运行时核心添加新的功能。每个插件都可以包含任何数目的扩展,而且可以使用扩展点对它们进行集成。同样,插件也可以定义自己的扩展点,其他开发人员可以在自己的插件或者 RCP 应用程序中使用这些扩展点。
检查前面给出的插件清单的两个
<extension>
元素。1 ...
2 < extension id ="googleApplication"
3 point ="org.eclipse.core.runtime.applications" >
4 < application >
5 < run class ="com.ibm.developerworks.google.GoogleApplication" />
6 </ application >
7 </ extension >
8
9 < extension point ="org.eclipse.ui.perspectives" >
10 < perspective
11 id ="com.ibm.developerworks.google.GooglePerspective"
12 name ="Google"
13 class ="com.ibm.developerworks.google.GooglePerspective" />
14 </ extension >
15 ...
第 2 至 7 行通过
org.eclipse.core.runtime.applications
扩展点定义了第一个扩展。 而该扩展为 RCP 应用程序声明了一个入口点。在该扩展元素内部,定义了一个<application>
元素。在标签内部有一个<run>
元素。而<run>
元素又包括一个类名称,RCP 应用程序启动时会执行该类。第二个扩展点是在第 10 至 17 行之间定义的。该扩展通过一个标题为org.eclipse.ui.perspectives
的扩展点定义了一个透视图,并将该透视图添加到普通的工作台上。创建基本的透视图
在创建了插件项目之后,需要创建透视图,创建透视图是一个两阶段的过程。首先,修改插件的清单以包含新的扩展,该扩展将使用
org.eclipse.ui.perspectives
扩展点。其次,使用来自新扩展点的属性创建一个透视图类。根据关于扩展和扩展点的早期讨论,Google 应用程序的插件清单已经包括下列扩展:...
<extension point="org.eclipse.ui.perspectives">
<perspective
id="com.ibm.developerworks.google.GooglePerspective"
name="Google"
class="com.ibm.developerworks.google.GooglePerspective"/>
</extension>
...
<perspective>
元素具有下列属性:id
—— 该属性为透视图定义了一个惟一标识符。name
—— 该属性为透视图定义了一个名称,工作台窗口菜单栏将使用它来表示该透视图。class
—— 该属性包含实现org.eclipse.ui.IPerspectiveFactory
接口的类的完全限定名。
要在 Google 项目内创建透视图类,需要完成下列步骤:
- 从菜单栏选择 File > New > Class ,以显示 New Java Class 向导。
图. New Java Class 向导
- 在 Name 字段内键入 GooglePerspective。
- 点击 Add 按钮,以显示 Implemented Interfaces Selection 对话框。
- 在 Choose Interfaces 字段内键入 org.eclipse.ui.IPerspectiveFactory,并点击 OK。
- 点击 Finish 按钮来创建新类。
该向导生成下列源代码:
1 package com.ibm.developerworks.google;
2
3 import org.eclipse.ui.IPageLayout;
4 import org.eclipse.ui.IPerspectiveFactory;
5
6 public class GooglePerspective implements IPerspectiveFactory ... {
7
8 public void createInitialLayout(IPageLayout layout) ...{
9
10 }
11 }
第 8 至 10 行中的
createInitialLayout
方法定义了透视图内所有视图和编辑器的初始布局。目前,您暂时不需要修改该方法。但在这个系列的第二部分,一旦定义了透视图,就需要修改该方法。WorkbenchAdvisor
前面集中讨论了构成 RCP 应用程序的各种组件。接下来将集中讨论如何将所有的事物结合到一起。在构建 RCP 应用程序时,核心任务之一就是创建一个实现抽象类
org.eclipse.ui.application.WorkbenchAdvisor
的类。WorkbenchAdvisor
类负责配置工作台,当执行 RCP 应用程序时,将显示该工作台。WorkbenchAdvisor
类包含下列方法,从而为开发人员提供了对普通工作台的生命周期的访问:initialize
—— 应该在显示任何窗口之前首先调用该方法。preStartup
—— 其次执行的就是这个方法,但它的调用是在第一个窗口打开之前。在启动或者恢复期间暂时禁用某些项时,该方法非常有用。postStartup
—— 对该方法的调用是执行的第三个操作,它的调用是在第一个窗口打开之后,可以用该方法重新启用preStartup
方法中临时禁用的项。postRestore
—— 该方法的调用是在已经根据以前保存的状态重新创建工作台及其窗口之后。preShutdown
——该方法的调用是在事件循环已经终止,任何窗口尚未关闭之前。postShutdown
——这是最后一个方法,它在事件循环终止之后被调用。
WorkbenchAdvisor
类包含下列方法,以便为开发人员提供对工作台窗口生命周期的访问:preWindowOpen
—— 在打开每个窗口时调用该方法。fillActionBars
—— 在调用preWindowOpen
方法之后调用该方法,可以使用它配置窗口的动作栏。postWindowRestore
—— 在根据以前保存的状态重新创建窗口之后调用该方法。postWindowOpen
—— 在已经打开一个窗口之后调用该方法。可以使用该方法注册任何窗口监听器。preWindowShellClose
—— 在用户关闭窗口外壳时调用该方法。
WorkbenchAdvisor
类包含下列方法,以便为开发人员提供对工作台事件循环的访问。eventLoopException
—— 可以调用该方法处理事件循环崩溃的异常。eventLoopIdle
—— 在没有更多的事件需要处理的时候调用该方法。
创建 WorkbenchAdvisor 类
要创建
WorkbenchAdvisor
类,需要在 PDE 内部完成下列步骤:- 从菜单栏选择 File > New > Class,以显示 New Java Class 向导。
- 在 Name 字段内键入 GoogleWorkbenchAdvisor。
- 点击 Browse 按钮,以显示 Superclass Selection 对话框。
- 在 Choose a type 字段内键入 org.eclipse.ui.application.WorkbenchAdvisor,并点击 OK。
- 点击 Finish 按钮来创建新类。
该向导生成了下列源代码:
1 package com.ibm.developerworks.google;
2
3 import org.eclipse.ui.application.WorkbenchAdvisor;
4
5
6 public class GoogleWorkbenchAdvisor extends WorkbenchAdvisor ... {
7
8 public String getInitialWindowPerspectiveId() ...{
9
10 return null;
11 }
12 }
在试图于 PDE 内执行 RCP 应用程序之前,需要对该类进行小幅的修改。首先,您需要修改位于第 7 至 9 行中的
getInitialWindowPerspectiveId
方法。该方法应该向新的工作台窗口返回初始透视图的标识符。由于在前面的小节中已经将 Google 透视图定义为com.ibm.developerworks.GooglePerspective
,所以该字符串将被返回给调用函数。其次,您需要添加一个称为preWindowOpen
的方法。该方法允许您设置工作台的窗口标题和尺寸。已修改的类如下所示:package com.ibm.developerworks.google;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
public class GoogleWorkbenchAdvisor extends WorkbenchAdvisor ... {
public String getInitialWindowPerspectiveId() ...{
return "com.ibm.developerworks.google.GooglePerspective";
}
public void preWindowOpen(IWorkbenchWindowConfigurer configurer) ...{
super.preWindowOpen(configurer);
configurer.setTitle("Google");
configurer.setInitialSize(new Point(300, 300));
configurer.setShowMenuBar(false);
configurer.setShowStatusLine(false);
configurer.setShowCoolBar(false);
}
}
创建 Application 类
在执行应用程序之前,需要创建一个
Application
类。与 Java 类中的 main 方法类似,该类是 RCP 应用程序的主要入口点,正如在插件清单内的org.eclipse.core.runtime.applications
扩展点之下定义的,它实现了org.eclipse.core.runtime.IPlatformRunnable
接口。要创建
Application
类,需要在 PDE 内部完成下列步骤:- 从菜单栏选择 File > New > Class,以显示 New Java Class 向导。
- 在 Name 字段内键入 GoogleApplication。
- 点击 Add 按钮,以显示 Implemented Interfaces Selection 对话框。
- 在 Choose Interfaces 字段内键入 org.eclipse.core.runtime.IPlatformRunnable,并点击 OK。
- 点击 Finish 按钮来创建新类。
- 向已生成的类添加下列 run 方法。对于大多数 RCP 应用程序而言,不需要定制该 run 方法,而且可以重新使用该方法。
...
public Object run(Object args) throws Exception ... {
WorkbenchAdvisor workbenchAdvisor = new GoogleWorkbenchAdvisor();
Display display = PlatformUI.createDisplay();
int returnCode = PlatformUI.createAndRunWorkbench(display,
workbenchAdvisor);
if (returnCode == PlatformUI.RETURN_RESTART)
return IPlatformRunnable.EXIT_RESTART;
else
return IPlatformRunnable.EXIT_OK;
}
...
利用 PDE 启动应用程序要在 PDE 内启动应用程序,需要完成下列步骤:
- 从菜单栏选择 Run > Run... ,以显示 Run 对话框,如图 9 所示。
图 9. Run 对话框
- 在 Configurations 字段中突出显示 Run-time Workbench,并点击 New 按钮,以显示新的运行时工作台配置,如图 10 所示:
图 10. 一个新的运行时工作台配置
- 在 Name 内段内键入 Google。
- 从 Application Name 字段中选择 Google.googleApplication。
- 点击 Plug-ins 标签,如图 11 所示:
Figure 11. Run 对话框的 Plug-ins 标签
- 选择单选按钮 Choose plug-ins and fragments to launch from the list。
- 点击 Deselect All 按钮。
- 选中 Workspace Plug-ins 选项。该操作包含了对 Google 项的选择。
- 点击 Add Required Plug-ins 按钮。该动作确定了哪些插件是执行应用程序所必需的。当装配单独的应用程序时,将使用该列表。
- 点击 Apply 按钮。
- 点击 Run 按钮来执行该应用程序。如果正确进行了所有配置的话,应该显示一个标题为“Google”的窗口,如图 12 所示。尽管该窗口并不执行任何功能,但是它的确向您阐述了如何用 PDE 创建一个普通工作台。
图 12. 新的 Google 窗口
导出应用程序
到目前为止,我们已经重点探讨了如何在 Eclipse IDE 内部运行 RCP 应用程序。下面,将重点关注如何在 PDE 内部完成下列步骤,从而创建单独的应用程序:
- 从菜单栏中选择 File > Export... ,以显示Export 对话框,如图 13 所示:
图 13. Export 对话框
- 从导出选项的列表中选择 Deployable plug-ins and fragments。
- 点击 Next,以显示 Export 向导的 Export Plug-ins and Fragments 页面,如图 14 所示:
图 14. Export 向导的 Export Plug-ins and Fragments 页面
- 选中 Google 插件。
- 在 Deploy as 字段中选择 a directory structure。
- 点击 Browse 按钮,并选择一个导出位置。
- 点击 Finish 来构建该项目。
准备目录结构
要完成单独的应用程序,您需要从 Eclipse IDE 目录复制一些文件到 Google 的导出目录。不幸的是,Eclipse 3.0 没有提供将所有需要的相关插件和 JAR 文件复制到导出目录的工具,因此您需要完成下列步骤:
- 从 Eclipse 3.0 IDE 的根目录将 startup.jar 复制到 Google 应用程序导出目录的根目录中。
- 从 Eclipse 3.0 IDE 插件目录将下列目录复制到 Google 应用程序导出目录的插件目录中:
- org.eclipse.core.expressions_3.0.0
- org.eclipse.core.runtime_3.0.0
- org.eclipse.help_3.0.0
- org.eclipse.jface_3.0.0
- org.eclipse.osgi_3.0.0
- org.eclipse.swt.win32_3.0.0 (Windows only)
- org.eclipse.swt.gtk_3.0.0 (Linux only)
- org.eclipse.swt_3.0.0
- org.eclipse.ui.workbench_3.0.0
- org.eclipse.ui_3.0.0
- org.eclipse.update.configurator_3.0.0
测试应用程序
要测试应用程序,则需要创建一个启动脚本。您可以使用自己喜欢的文本编辑器创建一个名为 google.bat(Windows)或者 google.sh(Linux)的文件,该文件包含下列内容:
java -cp startup.jar org.eclipse.core.launcher.Main -application com.ibm.developerworks.google.googleApplication
在完成该任务之后,您的导出目录应该具有下列结构:
- google.bat (Windows only)
- google.sh (Linux only)
- startup.jar
+ ----- plugins
+ ----- org.eclipse.core.expressions_3 .0.0
+ ----- org.eclipse.core.runtime_3 .0.0
+ ----- org.eclipse.help_3 .0.0
+ ----- org.eclipse.jface_3 .0.0
+ ----- org.eclipse.osgi.services_3 .0.0
+ ----- org.eclipse.osgi.util_3 .0.0
+ ----- org.eclipse.osgi_3 .0.0
+ ----- org.eclipse.swt.win32_3 .0.0 (Windows only)
+ ----- org.eclipse.swt.gtk_3 .0.0 (Linux only)
+ ----- org.eclipse.swt_3 .0.0
+ ----- org.eclipse.ui.workbench_3 .0.0
+ ----- org.eclipse.ui_3 .0.0
+ ----- org.eclipse.update.configurator_3 .0.0