RCP(Rich Client Platform)富客户端平台是基于Eclipse插件开发的一种应用。它是Eclipse 3.0版本后新增的一项功能。通过RCP可以快速构建应用程序,具有广阔的应用前景。选自《Eclipse SWT/JFace核心应用 》
22.1 RCP概述
在Eclipse平台的发展过程中,倡导的是插件的思想。可以说,插件是Eclipse平台的核心内容,但所有的这些插件的运行都要依赖于Eclipse平台的存在。但当程序员开发桌面的应用时,往往想摆脱对Eclipse IDE的依赖,而是希望使用最小的运行环境来运行系统。所以在Eclipse 3.0以后的版本中逐步地将插件的运行从Eclipse的运行平台中剥离出来,从而形成了RCP。
简单地说,RCP系统本质上是Eclipse的插件,但运行时却能够脱离Eclipse平台而独立运行。这就使得RCP的应用更加灵活和广泛。
22.1.1 什么是RCP
RCP本质上是Eclipse的插件,所以当开发RCP应用程序时,可以利用Eclipse平台UI外观和框架来快速地进行开发。例如创建一个菜单栏、工具栏,在RCP开发中很容易,只需要作一定的配置后,编写简单的代码就可以实现复杂的功能,这样就避免了许多重复性的工作。
RCP的系统可以脱离Eclipse平台独立运行,这样大大减少了打包程序后文件的体积,使系统更加小巧和雅观。图22.1清晰地显示了RCP与Eclipse的关系。
图22.1 RCP与Eclipse的关系图
另外,最重要的是Eclipse是一个开源平台,所以采用RCP也可以极大地降低系统的成本,具有很高的商业价值。
22.1.2 RCP应用的现状
RCP在Java桌面应用有很广阔的前景,就目前来说,已经进行了广泛的应用。主要分两大阵营,开源的和商业的。
1.开源的应用
● Azureus:http://azureus.sourceforge.net/,BitTorrent下载客户端软件,以支持40种语言,功能强大,已经被上百万的用户下载使用,并且获得了2006年Sourceforge.net的Best Overall Winner大奖。
● Bioclipse:http://www.bioclipse.net/index.php,生物信息学的一个绘图软件,可以绘制出DNA的3D图形,有兴趣的读者可以下载下来具体看一下。
● BrainBox:http://eclipsetrader.sourceforge.net/,基于RCP的股票交易软件,可以实时地查看股票信息和股票的历史走势图等。
● jCommander:http://jcommander.sourceforge.net/,基于选项卡界面效果的文件系统管理软件,可轻松地实现文件的管理。
● jFire:http://jfire.org/,基于J2EE的ERP软件,包括产品管理、客户管理、用户管理等模块,具有很灵活的自定义功能。另外,还使用了GEF和BIRT构建丰富的报表图形系统。还提供了扩展点,允许用户在此基础上进行开发。
● jLibrary:http://jlibrary.sourceforge.net/,开源的文档管理系统(DMS),可以将普通文件、视频文件和其他类型的文件进行分类,也可以进行查找和分类等。
● Zhongwen Development Tool(ZDT):http://zdt.sourceforge.net/,学习中文的一个软件,值得庆幸的是该软件是中国人开发的。如图22.2所示为该软件主界面的效果图。
图22.2 ZDT软件的主界面
2.商业的应用
● Actuate BIRT Report Designer:http://www.actuate.com/birt,BIRT是Eclipse的一个报表开发引擎的插件,该软件是BIRT报表的设计可视化客户端软件。使用该软件可轻松地创建所需的报表。
● Bay Breeze Software - SQL Edge:http://www.baybreezesoft.com/,提供了可视化的执行SQL语句的工作环境,能够显示环境数据库中表的关系图,也能够浏览表中的数据。
● BSI CRM on Eclipse:http://www.bsiag.com/joomla/index.php,CRM客户关系管理软件,包括联系人管理、任务管理、项目管理和市场管理等。
● IBM Workplace Client Technology:http://www-128.ibm.com/developerworks/ workplace/ products/clienttechnology/,IBM的客户管理软件。该软件的界面效果如图22.3所示。
图22.3 商业的RCP应用
%注意:读者若想了解更多的RCP应用案例,可以访问网站http://www.eclipse.org/ community/ rcp.php。
从以上这些RCP的实现案例中可以看出,RCP的应用非常广阔,从系统的文件管理到J2EE的企业管理软件,从可视化的报表工具到3D绘图,都可以应用RCP。只要是开发桌面的应用就都可以采用RCP来进行开发。
22.2 第一个RCP项目
了解了RCP有这么丰富的应用后,读者一定想迫不及待地知道如何来开发RCP程序。那么本节将一步步地讲述如何来开发RCP程序。
22.2.1 创建插件项目
RCP的开发基于Eclipse插件的开发,所以创建RCP的项目也是从创建插件项目开始的。以下为创建一个RCP程序的步骤:
(1)选择“文件”|“新建”|“项目”命令,在弹出的“新建项目”对话框中选择“插件项目”,单击“下一步”按钮,弹出如图22.4所示的对话框。
(2)输入项目名称为MyRCP,其他设置如图22.4所示。然后单击“下一步”按钮,弹出如图22.5所示的输入插件项目详细信息的对话框。
图22.4 “新建插件项目”对话框 图22.5 输入插件信息
(3)在该对话框中可以设置一些插件的信息,例如这里输入插件标识为“com. fengmanfei.myrcp”。为了保持唯一性,不与其他的插件混淆,一般使用网址加名称的形式。但要注意,一定要选中是否要创建富客户端应用程序选项。如果不选中,创建的只是普通的Eclipse插件项目,而不是RCP应用程序。按照如图22.5所示的设置完成后,单击“下一步”按钮,弹出如图22.6所示的对话框。
(4)在该对话框中,提供了创建RCP程序的几个常用的模板,这里选择Hello RCP模板。这是最简单的RCP程序,只有一个主界面。然后单击“下一步”按钮,弹出如图22.7所示的对话框。
(5)在该对话框中可以对RCP程序进行简单的配置,如窗口显示的标题等,这里使用向导默认的值。然后单击“完成”按钮,这样一个RCP的项目就新建完成了。
图22.6 选择RCP程序的模板 图22.7 设置初始化程序的配置
22.2.2 运行RCP程序
创建完RCP项目后的Eclipse平台会出现如图22.8所示的界面。
图22.8 创建RCP项目后的界面
在左侧的项目文件中,会看到自动生成了一些RCP所需要的一些文件,这些都是利用创建向导自动生成的,是RCP程序运行所必需的一些文件。右侧是该项目的描述信息。可以单击右侧的标签来查看设置具体的插件配置参数。22.2.3节将着重讲述这些参数和文件的意义。要运行RCP程序,有以下两种方法:
● 最简单的方法是在右侧“测试”信息框中,单击“启动Eclipse应用程序”链接来运行。如果想要以调试方式运行,则单击“以调试方式启动Eclipse应用程序”链接。
● 另外也可以用传统的方式运行RCP程序。在项目工程名称处右击,在弹出的快捷菜单中选择“运行方式”|“Eclipse应用程序”命令,也可以运行RCP程序。
无论是哪种方式运行,使用以上方法创建的RCP程序运行后的界面效果如图22.9所示。
图22.9 RCP程序运行后的效果图
从图22.9中可以看出,使用向导创建的Hello RCP程序很简单,运行后只有一个主窗口界面,这就是一个最简单的RCP程序。然后开发RCP的工作就是如何在该基础上进行开发,按照需要来开发界面的效果。
用个比喻来说,现在的这个RCP程序好比是一座空房子,里面什么都没有,接下来的开发的工作就是进行房子的装修,按照设计来添置不同的家具。
22.2.3 插件的文件清单
在进行插件开发之前,首先来看一下22.2.2节中利用向导建立的项目中各个文件所代表的意义。
(1)看一下自动生成的各个文件,如图22.10所示。
图22.10 项目的文件结构
这些文件的具体说明如下:
● src文件夹下为运行插件时的一些类文件。
● MANIFEST.MF为插件清单文件,是插件与外界沟通的桥梁。
● build.properties文件为构建RCP程序时所导入的类库设置。
● plugin.xml是最重要的文件,该文件是插件的配置文件,集中管理插件内部的运行,在该文件中可以查找所有与该插件有关的信息。
(2)看一下插件的配置信息。在如图22.11所示的选项卡中,可以单击切换不同的选项卡。
图22.11 插件配置选项卡
如图22.11所示的各选项卡所表示的意义如下:
● “概述”选项卡可以查看该插件项目所有定义配置信息。
● “依赖项”、“运行时”选项卡是设置MANIFEST.MF文件的,在这两个选项卡所做的修改将同步应用于MANIFEST.MF文件。在Eclipse之前的版本中,没有MANIFEST.MF文件时,则是在plugin.xml文件中配置的。
● “扩展”选项卡是插件开发最重要的内容,各个插件都是基于扩展点的。在该选项卡中可以设置插件所使用的扩展点,并且在该选项卡中所做的配置将同步改变pluglin.xml文件中的内容。
● “扩展点”选项卡用来设置该插件提供其他开发者的接口。如果想让其他开发人员对该插件进行开发,通常要提供这些开发人员一些接口,创建自定义的一些扩展点。
● “构建”选项卡可以可视化配置build.properties文件,“build.properties”选项卡可以查看该文件的源文件。
22.2.4 MANIFEST.MF文件
MANIFEST.MF文件是保存OSGi 的 Bundle文件。OSGi开放服务网关协议(Open Services Gateway Initiative)是一个框架规范。OSGi规范为网络服务定义了一个标准的、面向组件的计算环境,它最初的目的就是为各种嵌入式设备提供通用的软件运行平台,屏蔽设备操作系统与硬件区别的中间件平台。Eclipse OSGi 框架支持该规范。目前,OSGi 联盟发布的最新OSGi服务规范为4.0。
通俗地讲,该文件也就是与其他平台的接口,通过该接口,外部平台可以使用该Eclipse的插件程序。如果读者有兴趣,可以访问http://www.osgi.org/,以了解更多该规范的信息。
1.MANIFEST.MF文件清单
下面具体来看一下MANIFEST.MF文件所配置的信息,如图22.12所示为MANIFEST. MF文件。
图22.12 MANIFEST.MF文件
其中,可以发现这些信息都是以key和value值来描述的。这些key值所表示的意义,可以参考Eclipse自带的参考帮助文档。以下是几个关键的key值所表示的意义。
● Bundle-Name:插件的名称。
● Bundle-SymbolicName:为插件的唯一标识。
● Bundle-Activator:为主程序启动的类的全名。
● Require-Bundle:系统编译和运行的依赖项,可以加入其他所必需的插件。
2.添加依赖项
在编译和运行程序时,可能需要使用其他插件类库,这时可以在“依赖项”选项卡中单击“添加”按钮,然后选择运行时所必需的插件或者是某一个插件的类包。如图22.13所示为导入了Ant构建包后的界面。
图22.13 导入依赖项
这样添加依赖项后,MANIFEST.MF文件会加入以下的代码:
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,
org.eclipse.ant.core
此时可以看到,刚才导入的org.eclipse.ant.core自动添加到了Require-Bundle的值中。另外需要注意的是,这些类包加载是按照顺序进行的,所以可以使用“向上”和“向下”按钮进行调整。当然,运行时加载的插件只要能满足系统运行即可,越少越好,因为太多了会影响插件运行的加载速度。
22.2.5 build.properties文件
build.properties是保存构建、打包和导出插件所需的所有信息的文件。如图22.14所示为配置构建文件的界面。在该界面上的设置将会保存到build.properties文件中。例如,此时该文件中的代码如下:
source.. = src/
output.. = bin/
bin.includes = META-INF/,/
.,/
bin/
jars.compile.order = .
其中,source表示源文件的路径,output表示编译后的.class文件所在的路径,bin.includes表示打包后包中所包含的文件,jars.compile.order为编译的顺序。
图22.14 构建界面
22.2.6 plugin.xml文件
plugin.xml文件是插件开发中最重要的文件,包含声明插件的扩展和扩展点配置。如 图22.15所示为该文件的源代码界面。
下面仔细分析一下各个扩展点的意义。每个扩展点都是一个<extension>元素。下面以第一个扩展点为例,说明各属性的意义。
● id="application",表示该扩展点的标识。
● point="org.eclipse.core.runtime.applications",表示扩展点的类型。这里表示该扩展点是系统扩展点,例如另一个扩展点类型“org.eclipse.ui.perspectives”为透视图扩展点。
● <run>子项中定义了系统启动的class类,为com.fengmanfei.myrcp.Application,可以在源文件下找到这个.java源文件。
图22.15 plugin.xml文件
对于不同的扩展点有不同的配置元素,读者可以参考Eclipse的帮助文档。另外,读者无须手动输入这些配置文件,使用Eclipse自带的创建扩展点向导就可以轻松地完成创建扩展点的工作。
22.3 RCP运行的基本原理
了解了这些配置文件后,下面仔细讲解一下整个RCP运行的过程。在22.2节创建的项目中,已经自动生成了MyRCPPlugin、Application、ApplicationActionBarAdvisor、Application WorkbenchAdvisor和Perspective类。这些类是怎样联系起来的呢?就是以下所要学习的内容。
22.3.1 插件类MyRCPPlugin
系统运行后首先在MANIFEST.MF文件中找到Bundle-Activator所对应的插件类,本项目中是myRCP.MyRCPPlugin类,表示是在myRCP包下的MyRCPPlugin类和该类的具体代码如下:
MyRCPPlugin.java
package myRCP;
import org.eclipse.ui.plugin.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.osgi.framework.BundleContext;
/**
* 该插件类继承自AbstractUIPlugin类
*/
public class MyRCPPlugin extends AbstractUIPlugin {
//插件类的对象,为静态对象
private static MyRCPPlugin plugin;
/**
* 构造方法
*/
public MyRCPPlugin() {
plugin = this;
}
/**
* 装载Bundle文件并启动插件
*/
public void start(BundleContext context) throws Exception {
super.start(context);
}
/**
* 插件运行结束后执行该方法
*/
public void stop(BundleContext context) throws Exception {
super.stop(context);
plugin = null;
}
/**
* 返回该插件的对象
*/
public static MyRCPPlugin getDefault() {
return plugin;
}
/**
* 返回相对于插件包文件下的相对路径的图片文件
*
* @param path the path
* @return the image descriptor
*/
public static ImageDescriptor getImageDescriptor(String path) {
return AbstractUIPlugin.imageDescriptorFromPlugin("com.fengmanfei.myrcp", path);
}
}
该类主要创建整个插件的对象,是插件的全局对象。可以通过该类的静态方法获得插件对象的引用,然后获得插件的各种信息,包括插件所对应的Bundle文件信息、log日志对象和工作台对象等。例如,以下代码可以获得该插件在MANIFEST.MF定义的标识符。
MyRCPPlugin.getDefault().getBundle().getSymbolicName();
通过MyRCPPlugin.getDefault()还能获得插件的其他对象。各种方法请读者参阅Eclipse API 帮助文档。