UML软件工程组织

Eclipse RCP:用于构建平台的平台
作者:Wayne Beaton  出处:bea中国

技术存在着一定的周期性。在经历了一段由瘦客户端统治的时期后,富客户端技术开始了它的回归。大量的组织正在将它们的应用程序构建成富客户端,其中许多组织将其应用程序建立在RCP(Eclipse Rich Client Platform)的基础上。术语富客户端首先表明此应用程序为用户提供丰富的体验;其次,它还表明此应用程序是某台服务器的客户端。虽然富客户端并不必须具有对应的服务器组件,但是它们通常会有对应的服务器组件。

富客户端在很多方面与胖客户端类似。它们两者都能为用户带来本地桌面体验,并提供那些通过瘦客户端技术很难、不方便或不可能交付的信息和功能。然而,富客户端可提供更多好的特性。胖客户端通常是一个难以部署和更新的大型单体应用程序,而富客户端在体积上更为轻巧,并且是基于部署和更新相对容易的组件模型的。从历史上来看,胖客户端是特定于平台的;而当今的富客户端技术发挥了底层平台的强大功能,同时隐藏了底层平台的细节,从而允许开发人员将精力集中于任务而不是各种特殊平台的特殊细节。

相对于胖客户端,富客户端还具有更好的可伸缩性。传统上,胖客户端直接与数据库相连接。这样就限制了胖客户端的运行环境(防火墙可能会限制胖客户端与数据库之间的连接),同时应用程序的可伸缩性(客户端与服务器之间的连接总数)也可能会受到数据库的限制。富客户端通常利用应用服务器,后者负责建立到数据库的连接。这种配置非常灵活(防火墙友好的)并且具有高度的可伸缩性。当然,技术中并没有必然限制胖客户端与应用服务器进行通信的东西,只不过在胖客户端技术流行的时候,应用服务器还没出现罢了。

没有规则规定富客户端应用程序必须是某台对应服务器的客户端。许多利用富客户端技术的组织正在构建健壮、可扩展、可更新、本地化的独立应用程序。同样,虽然富客户端通常利用应用服务器,但是并不存在要求必须这么做的规则或技术限制。没有理由说富客户端应用程序不能直接访问数据库。

富客户端技术代表了胖客户端与瘦客户端二者优势的结合:丰富的用户体验、高可伸缩性、平台独立,以及非常易于部署和更新。

Eclipse RCP是一项位于Eclipse平台核心的功能。大多数人想到Eclipse时,他们会想到Java集成开发环境(IDE)。如果您将Eclipse中关于IDE的内容剥去,剩下的就是一个提供基本工作台功能的核心,这些功能包括对可移动和可叠加的窗口组件(编辑器和视图)、菜单、工具栏、按钮、表格、树形结构等等的支持。这个核心功能就是Eclipse RCP。

Eclipse RCP为应用程序开发人员提供了:

·应用程序和特性的一致且本地的外观

·公共应用程序服务,例如窗口管理、更新管理、帮助和选择管理

·本地的外观,利用Windows、Mac OS X、Linux、Solaris、HP-UX、AIX和嵌入式设备上的实际平台窗口部件

·标准化的组件模型

·普及的可扩展性

·整合的更新机制

·顶级开发工具(Eclipse 软件开发包(SDK)是世界级的软件开发环境)

尽管使用这个术语事实上是不合适的,但Eclipse RCP仍可以被视为构建富客户端应用程序的中间件。它提供应用程序所需的基础设施,从而允许开发人员将精力集中于核心应用程序功能而不是细节。别再浪费时间了:立即使用Eclipse RCP吧。

组件

Eclipse RCP由许多组件构成,每个组件负责整个环境中相应部分的功能。事实上,Eclipse RCP几乎所有的部分都是由组件构成的;除了少量的引导代码,RCP的每一部分都是一个组件。在Eclipse世界中,组件更多时候是被称为插件(或者在OSGI词汇中被称为包裹)。术语“插件”表明了这项组件功能在某种程度上属于二级功能,或者它只是内置功能的一个附加物。但事实并非如此;Eclipse RCP对待所有的插件都是平等的,内置和定制插件之间并没有明确的概念界限。您创建的用于实现应用程序行为的插件可与构成Eclipse RCP的插件一起运行。

通常,富客户端应用程序的开发都是从单一插件开始的。在一个单独的插件中,您可以为您的应用程序定义整个用户界面、业务逻辑和对象模型。创建一个新的Eclipse RCP应用程序非常容易,您只需选择菜单项File>New>Project...、选择创建新的Plug-in Project(插件项目)、然后遵循出现的向导中的步骤。在向导的Content(内容)页面上,对于问题“Would you like to create a rich client application?(您是否希望建立一个富客户端应用程序?)”,记得选择“Yes(是)”。图1中显示的是向导的Templates(模板)页面;在这里我们选择创建“RCP application with a view(带有视图的RCP应用程序)”。

 

 图1. New Plug-in Project向导的Templates页面

这将创建一个包含RCP应用程序所需部分的新插件,其中包括工作台(菜单栏和工具栏)设置和包含一个表格的单一视图(参见图2)。


 图2. 向导创建了一个具有全部功能的RCP应用程序

向导生成了以下类:

Application.java

生成的Application类包含一个单一方法,run(Object args),此方法负责运行应用程序(真奇怪)。这个方法引导并打开工作台窗口,当它退出时,应用程序将关闭。

ApplicationActionBarAdvisor.java

ApplicationActionBarAdvisor类负责构建菜单栏、工具栏和状态行。这一生成的类会创建一个带有单一File菜单(其中包含Exit项)的菜单栏。您可以利用fillCoolBar(ICoolBarManager coolBar)方法为您的工作台窗口添加一个工具栏。类似地,您也可以用fillStatusLine(IStatusLineManager statusLine)来为工作台窗口添加一个状态行。

ApplicationWorkbenchAdvisor.java

ApplicationWorkbenchAdvisor类提供大量到应用程序生命周期的钩子。例如,您可以添加程序启动或关闭时调用的方法。生成的实现只是指定呈现给用户的初始视图。

ApplicationWorkbenchWindowAdvisor.java

和ApplicationWorkbenchAdvisor类似,ApplicationWorkbenchWindowAdvisor类提供到工作台生命周期的钩子。您可以添加创建、打开、还原或关闭工作台窗口时调用的方法。生成的实现提供一个preWindowOpen()方法,此方法设置窗口的初始大小和标题,以及是否隐藏工具栏和状态行(二者都是隐藏的)。

Perspective.java

Eclipse SDK提供了大量的视图。生成的应用程序包括一个视图;您可以根据要求指定额外的视图。生成的视图隐藏了编辑器区(即,编辑器在视图中是隐藏的)并且会添加由向导生成的视图。这种视图被设置为固定的:它的视图没有熟悉的标题栏,而且不能移动。用户可以通过将设置从false修改成true(和为应用程序添加一些新的视图)来随意调整视图的位置。

View.java

生成的View类包含了一个带有少量硬编码条目的表格。您可以利用它来制定您的应用程序外观。如果表格是您所需的,您可以通过将其与您的对象模型相连接来定制它,或者使用一个或多个窗口组件彻底替换掉它。

下一步我们将根据要求,通过更改或增加菜单、菜单项、工具栏、视图,以及编辑器来修改生成的代码。

进阶

以这种方式构建应用程序可以使开发人员了解到很多基本功能。RCP不仅是一个窗口组件的集合,它还提供了一个用于管理应用程序用户界面的系统,其中包括了更高等级概念的编辑和视图(可以移动和叠加)、工具栏、菜单、选择管理等等。但是用这种方式构建应用程序仅仅发挥了Eclipse的一小部分功能。这是一个进入Eclipse应用程序构建的不错的开始;接下来的步骤自然就是构建真正的组件了。

插件是Eclipse平台的一项重要功能。实际上,Eclipse本身就是一个插件集;Eclipse中的大部分组件都是插件(除了一小部分引导代码)。这使得Eclipse极具可扩展性。可以通过创建一个或多个插件(这些插件可由框架动态发现和安装)的方式,将新功能添加进SDK。插件可被动态发现;添加插件时并不需要更新插件列表。

类似于Eclipse SDK,RCP应用程序也是一个插件的集合。插件的外形大小不一。如上面所说的,您可以用一个单一的插件建立整个Eclipse RCP应用程序并执行ECP全部的功能。或者您也可以将RCP应用程序建设成一个插件集,每一个插件都会执行程序的一部分功能。

将RCP应用程序构建成插件集有很多获益,包括:

·延迟加载

Epclise只在需要的时候加载插件。如果您将您的程序分解成很多插件,您就可以缩短程序的启动时间,改善它的内存占用率。在启动时,只有初始化所需的插件子集会被加载,而不是整个应用程序;这将减少启动所需的时间和内存。

·更新

Eclipse可根据需要更新单一插件。如果您的应用程序是由多重插件构成的,那么更新时只需下载所需插件的那一部分进行安装。这样的话,就会减少应用程序更新的时间和所需的资源。

·扩展性

将一个应用程序分割成多重插件有利于程序今后的扩展性。

·重用

将应用程序建成一个组件集合,使得您有机会在其他程序中重用这些组件而无须修改代码。

·更好的设计

使用多插件更利于设计。当您分割一个应用程序时,您会被迫去考虑一些类似于“我该如何去定义组件之间的接口”或“怎样才能使它们之间的交流更便利”之类的重要问题。不幸的是,这并不保证您能得到一个伟大的设计,但它确实鼓励您往这方面努力。

分割应用程序的一个普遍的方式是将您的领域业务逻辑和对象模型归入一个插件,将您的用户界面归入另一个。这样做的话,您可以有效地按照模型观察控制器模式所列出的程序行来编写您的程序。那就意味着,应用程序的业务逻辑(包含在其自身的插件里)和用户界面的细节互不干涉(理想状态下,这就避免了任何用户界面技术或语言的概念)。用户界面代码(观察和控制层)由另一个插件来提供,从而不会牵涉到商户逻辑的执行。业务逻辑插件从属于用户界面插件,后者会调用某些在业务逻辑中定义的模型。这种架构形式十分类似于Java EE应用程序:一个网络模型(WAR文件)包含了小服务程序(控制器)和JSP(视图);其他的JAR文件则包含了业务逻辑和对象模型。

Eclipse组件在这种架构模式下提供了极其出色的服务。通过加强可视化模型,Eclipse迫使开发人员不再愿意把用户界面代码放入模型中(当然,真正的程序员可以解决这个问题)。商户逻辑插件(或其他的插件)都从属于用户界面插件集:在视图中可以看到模型,但反过来却不行。通过鼓励这种分割方式,代码中的耦合度降低了,从而使代码在修改过程中不再那么脆弱而且代码的重用率也提高了。

组件的集合

当您将您的应用程序代码分割成多重插件之后,接下去的步骤就是将这些插件组合成一个整体,从而建立一个RCP应用程序。定义一个应用程序所需的插件集是产品配置的功能之一。产品配置中也包含了品牌信息,包括启动画面的位置、窗口图标、介绍图像和文本等。

将一个插件集合组装成一个应用程序是一项简单的工作。实际上,在这一步中,最大的挑战就是如何品牌化应用程序从而使其更加美观,作为品牌化过程的一步,您可以添加启动画面、窗口图标、启动图标和介绍图形。通过选择菜单条目File>New>Product Configuration,您可以为您的应用程序创建一个产品配置。此向导如图3所示。


 图3.“New Product Configuration(新产品配置)”向导

作为创建新的产品配置的一部分,您需要指定一个父插件项目。通常,就是这个插件定义了应用程序。创建初始配置的方法有三种:

·创建一个包括了基本设置的配置文件。选择这一项后,将创建一个空配置文件,您必须自己完全配置它。

·使用一个现有的产品。选择这一选项后,您将根据现有的产品配置中的值创建一个新配置文件。

·使用启动配置。选择这一选项后,初始配置是基于现有启动配置中引用的插件集的。如果您先前是通过菜单中的Run As>Eclipse Application来运行您的程序,那么您就可以使用这一选项。

您可以创建多个产品配置。例如,当基本程序需要通过所添加的可选插件来实现一些功能,那么创建这些插件的配置就显得很有必要。向导中的第二个选项旨在方便多个类似配置的创建。

在产品配置编辑器的Configuration(配置)选项卡上(参见图4),您可以为应用程序所需的插件命名。


 图4. 产品配置编辑器的Configuration(配置)页面。

插件列表需要包括所有应用程序自带以及所需的插件。编辑器会帮助您为所需的插件分类。当您把应用程序的插件添加到插件列表后,单击Add Required Plug-ins按钮;这样就会将您的插件所要参考的插件,以及那些插件所要调用的插件全部添加进了插件列表。这个集合会包含很多Eclipse平台本身的插件。使用这个按键时,您只要添加最上层的插件,随后编辑器会自动搜索并添加与这些上层插件相关联的插件。这一功能同样可以使用在产品的配置上;事实上,使用更新系统就是为了使用新的功能。

启动文件与那些负责启动程序的可执行文件相关联。在这一页面上,您可以定义文件浏览器中的图标和名称。Branding页面负责品牌化应用程序(真奇怪)。其中包含了启动画面的识别、可选启动进度条的位置、窗口图标,以及关于对话。这些您所指定的信息将在导出项目时使用。

导出程序时,所有在配置页面列出的插件会连同标记信息以及基本Eclipse配置一起被建立(如果需要的话)或复制到您的文件系统的目录中。这个结合了Java Virtual Machine(JVM)的目录就是您运行应用程序所需的全部。

运行程序并不需要对其进行导出;您可以在工作台中直接运行应用程序。对于测试配置和用调试器确定并解决问题,这是一个很棒的方法。在产品配置编辑器的全局页面上,有两个选项可以用来运行程序。这两个选项是以超链接形式出现的:“运行产品”和“在调试模式中运行产品”,两者分别在常规和调试模式中运行启动配置。

建立平台

到目前为止,这场讨论主要集中在一个由众多定义非常明确的插件集构成的应用程序上。Eclipse的一个非常出色的功能就是它能够动态地搜索和加载组件。这使得开发人员能够去构建扩展性很强的应用程序。更进一步说,您可以将RCP应用程序构建成具有您自己的开放API的基础平台。

在Contributing to Eclipse: Principles, Patterns, and Plug-Ins这本书中,作者们讨论了一些有关于扩展性的规则。第一,开放规则指出,“只要有可能,就让其他人服务于您的工作。”为了做到这一点,您可以定义您自己的扩展点集,使得其他开发人员能够在您的应用程序上进行他们自己的创作。Eclipse的工作台大量使用了这一机制,每个开发人员都能添加他自己的视图、编辑窗口、菜单入口等等。

想象RCP应用程序正在管理一张to-do列表。这个应用程序的核心功能提供了这项to-do任务的对象表达,以及可视化这张任务列表的能力。图5显示了列表的视觉表达。

 
 图5.To Do View

就其自身来说,这个应用程序已经够吸引人的了。而更强大的功能是在我们将程序带入扩展的空间后出现的。用硬编码编写应用程序来存储任务信息会变得相对简单。但除了硬编码,您可能会开放您的应用程序以便让其他的开发人员通过扩展点将他们的存储系统与您的代码相连。您的初始实现可以引导扩展点使其具有在本地数据库存储信息的能力。另一个开发人员可能会利用一项网络服务或其他功能来扩展您的应用程序使得它能够在远程服务器上存储信息。

想象一下您的应用程序是如何与桌面交互的。为应用程序提供对拖拽的支持相对简单。但是从哪里拖?在您的初始实现中,您可能会将文本从浏览器中托拽入应用程序。如果您在应用程序中建立一个扩展点,您可以允许其他开发人员能够扩展您的程序,使其能够从诸如Microsoft Outlook或Mozilla Thunderbird之类的应用程序中进行拖拽。

通过建立一个扩展点,您使自己和其他开发人员能够在不改变应用程序的基础上对其进行扩展。利用扩展点动态地搜索可利用的扩展能使您的程序变得完全可制定。例如,也许让应用程序能够从Outlook中把程序包拖到Linux中没有什么意义;对此配置来说,您只需将那个支持Outlook的插件去掉即可。

当然,有效地利用扩展点机制需要不断的实践。

结束语

Eclipse RCP是一个用于构建富客户端应用程序的功能强大的框架。直观上,RCP将主机平台与本地外观、窗口管理、可定制性(具有可叠加的编辑器和视图)紧密整合在了一起。但这只是它的表面。位于RCP核心的是将功能和灵活性完全发挥的OSCI-兼容组件模型。当被请求时,RCP会动态地发现和加载这些组件;它们可以进行更新和扩展。

人们最终必将完全接受Eclipse RCP。一开始,您可能会把精力放在熟悉Eclipse RCP的界面上。随着对组件模型的熟悉程度不断加深,您会开始将代码分割成多重插件。最终,当您掌握了基于多重扩展插件的领域平台开发后,Eclipse RCP真正的强大功能将展现在您的眼前。

 

版权所有:UML软件工程组织