尽管没有先决条件,但是如果您下载、安装并配置 Eclipse 3.0、1.4 Java 虚拟机和 Apache Ant,将会发现本教程还是很容易理解的。如果没有安装这些工具,请引用、下载并安装下列资源:
什么是 RCP?
在浏览器大战的日子里,许多开发人员和用户都对桌面 Web 浏览器缺乏创新和进步而感到失望。尽管 Web 浏览器允许机构为大量的用户部署后台办公应用程序,但试图提供支持多个操作系统上的多个浏览器的可用接口,将加重开发人员和管理人员的负担。RCP (Rich Client Platform)是一个令人激动的概念,它寻求满足对单一跨平台环境的需要的解决方法,以创建高交互性商业应用程序。
实质上,RCP 提供了一个通用的 Eclipse 工作台,开发人员可以扩展该工作台来构造自己的应用程序。一个应用程序至少包括一个定制插件,并且可以使用与 Eclipse 3.0 IDE 相同的用户界面元素。在转向对如何创建插件的讨论之前,应该让您自己熟悉一下 Eclipse 用户界面的基本元素,如图 1 所示。
该环境的基本元素包括:
标准窗口小部件工具箱和 JFace
如果查看组成 Eclipse 平台的源代码,你会注意到,它并没有使用 Java 标准窗口小部件工具箱。在 Eclipse 平台开发期间,该项目产生两个用户界面工具箱,您可以在 Eclipse 项目以外的地方使用它们。这些工具箱包括:
在开发 RCP 应用程序期间,可以大量使用 SWT 和 JFace 类。
实现 RCP 应用程序的步骤
在介绍在 Eclipse 内部开发 RCP 应用程序的细节之前,我们来回顾一下实现这种类型项目的一般性步骤。
WorkbenchAdvisor
类。 Application
类。 使用插件开发环境
Eclipse IDE 的组件之一是一个称为插件开发环境(Plug-in Development Environment,PDE)的特定透视图。该透视图为您提供了创建和包装定制 Eclipse 插件或者 RCP 应用程序所需要的所有东西。您可以通过实现下列步骤来访问该透视图:
创建项目
利用在 Eclipse 中打开的 PDE 透视图完成下列步骤,以创建一个新的项目:
理解插件清单
在您完成 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 项目内创建透视图类,需要完成下列步骤:
该向导生成下列源代码:
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 内部完成下列步骤:
该向导生成了下列源代码:
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 内部完成下列步骤:
利用 PDE 启动应用程序
要在 PDE 内启动应用程序,需要完成下列步骤:
导出应用程序
到目前为止,我们已经重点探讨了如何在 Eclipse IDE 内部运行 RCP 应用程序。下面,将重点关注如何在 PDE 内部完成下列步骤,从而创建单独的应用程序:
准备目录结构
要完成单独的应用程序,您需要从 Eclipse IDE 目录复制一些文件到 Google 的导出目录。不幸的是,Eclipse 3.0 没有提供将所有需要的相关插件和 JAR 文件复制到导出目录的工具,因此您需要完成下列步骤:
测试应用程序
要测试应用程序,则需要创建一个启动脚本。您可以使用自己喜欢的文本编辑器创建一个名为 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