《OSGi与Equinox》第三章

 由  池建强 发布

第二部分 OSGi示例

要想了解OSGi和Equinox的功用,最好是构建一个真实的系统。本书的这部分内容将指导你构建这样的系统。我们从零开始,先为OSGi开发设置Eclipse环境,然后创建一个功能合理完备的车辆管理系统Toast,然后运行并给予调试与优化。下图截屏展示了将构建的Toast系统中车辆内客户端示例。

http://assets.osgi.com.cn/article/7289495/1.jpg

在第二部分中,我们将以非正式教程的方式逐步阐述并耐心指导。建议跟随实践所描述的步骤完成开发。如果读者不想按部就班,或认为那样太繁琐,每一章的完整代码都可在便捷的示例管理器(Sample Manager)中获得。尽管这些章节的内容都是针对具体开发的,但文字内容也仍然是完整的,可以独立阅读,而不必遵循这些步骤或者提供的代码。

第3章 教程介绍

本章将介绍如何开发一个功能完全基于OSGi的应用——Toast。为了增强示例的连贯性,并与软件开发实践中遇到的情况紧密匹配,全书将使用相同的应用作为示例。自始至终,我们提及的原则和实践均可适用于各种应用领域和执行场景。在叙述具体细节之前,我们先概括出Toast的特性和演变,以便打好基础。同时,也需要设置好可工作的开发环境。

本章将聚焦在以下三个主要方面:

  • 概括示例应用及其演变;
  • 设置Eclipse IDE,以便你可以开发自己的代码;
  • 获取并使用示例管理器(Samples Manager),以便比较和管理示例代码。

3.1 何为Toast

Toast是远程信息管理(Telematic)和车队管理领域中的示例应用。虽然你可能不熟悉这些术语,但一定会对这个概念本身有一定的了解。维基百科中是这样描述远程信息管理的:

Telematics是远程通信的电信学与信息科学的合成词。更具体地说,它是通过通信设备实现信息发送、接收和存储的学科。

在汽车导航和娱乐设备中,你都能见到它的身影。典型的远程信息管理系统会通过接口装入车载设备,并提供与设备交互和管理的用户接口;更成熟也更复杂的系统则可以通过无线网络,与车辆管理系统的控制中心连接,从而可以远程控制设备。

Toast的最终版本将涵盖上述所有功能,它可以连接模拟的GPS和安全气囊,也可集成谷歌地球(Google Earth),还能与使用了多种协议、基于OSGi的车辆管理控制中心通信。

从较高层面来看,Toast由客户端后端组成。Toast客户端提供多种功能,包括一个会在安全气囊展开时向控制中心通报车辆GPS位置的应急应用,一个追踪车辆GPS位置并定期通报给控制中心的应用,一个控制车辆音频系统和气候系统的触摸屏接口,以及一个逐向道路导航系统。

本书将介绍Toast后端的开发过程,将其从一个简单的紧急情况监视台,改进为一个可扩展的、用于管理和控制车辆的车辆管理平台,包括车辆定位、追踪和软件管理或预配置(provisioning)。

作为示例,Toast的吸引力不只局限于其众所周知的远程信息管理、车辆管理和大量应用功能的内容。它具有极强的可扩展性,我们可以合理开发不同技术,不需要做出弥补。更为重要的是,这些场景使得我们能够讨论现实中与OSGi相关的各种挑战。

Bundle粒度——一套部署好的Toast系统包含了车辆内置客户端、设备模拟器和控制中心,bundle共计100多个。这可能看起来有些多,但这种架构既可以代表真实的系统,又可以让我们在处理大量相互依赖的bundle时,展示一些最佳实践。

第三方库——大多数现实中的应用都会使用第三方代码,Toast也不例外。整个Toast应用使用的库,来自于Eclipse、Apache、更广泛的Java开源社区,以及Google JavaScript。我们会引导你将非OSGi的第三方库合并到基于OSGi的应用当中,并详述需要注意的问题。

动态安装和移除功能——Toast是一个高度动态的应用,可以进行功能的安装和移除,服务器端和客户端的交互,以及用户输入的处理。通过这个例子,我们将展示如何编写bundle,使其适应于新功能以及依赖的移除或更新。我们也将展示如何使用Equinox的最新部署实现——p2,来管理可执行的Equinox配置文件(profiles)。

扩展性和协作性——若你经历过Toast的开发过程,就会看到许多扩展和协作的方法,包括服务、声明式服务(Declarative Services)、白板模式(Whiteboard Patten)、Equinox扩展注册(Equinox Extension Registry),等等。相对而言,编写新功能较为直接,Toast将其与支持动态安装和移除应用相结合,从而创建一个强大的软件平台。

测试和模拟策略——在本书中,Toast发展成为了一个适度复杂的应用。因此,我们提供了自动化测试的示例和最佳实践——从POJO(plain old Java object)开发到基于OSGi系统的测试中使用的模拟对象(mock objects)和JUnit。我们也将展示如何通过模拟设备来测试,以应对真实的设备硬件不可用,或者从经济的角度而论该设备不可使用的情况。(展开真正的安全气囊非常昂贵!)

Off-board通信——如今,极少有系统可以独立使用。大部分系统最终会与off-board的服务器端、对等端或者子系统进行通信。例如,Toast客户端使用HTTP,与运行了Jetty Web服务器的控制中心进行通信。设备模拟器也使用了类似的方法,但是在车辆中嵌入了一个小的Web服务器。通过使用Eclipse通信框架(ECF),与软件仓库进行交互可以完成预配置功能。

图形和基于Web的用户接口——使用OSGi当然不需要用户接口,许多现实中的应用是“无头的”(headless)。然而,Toast提供了一些UI示例:用于车辆内置触摸屏的图形用户接口;用于控制中心的简单的Web UI;以及用于设备模拟器,基于Web的JavaScript UI。

总之,Toast十分有趣。它简单而且易于理解,功能也足够丰富,可以为许多应用和技术集成提供基础。开发Toast所学到的内容,可以很容易地用于其他领域和应用。

Eclipse中的Toast

将Toast与Eclipse放在一起大有裨益且喜闻乐见。因为我们在Eclipse中展示Toast时,会收获许多扩展和改进它的好主意。为了促进它的发展,我们捐献了Toast的一个快照版本作为Eclipse的示例工程,其代码在第14章中。我们衷心希望它能得到改进,从而超过你在本书所看到的例子。请参见http://wiki.eclipse.org/Toast获取更多信息。

3.2 Toast的演变

在第二部分,我们将通过一些教程章节来开发Toast。每章会展示一个新概念,并在前面章节的基础上做出增量改进。伴着开发进度,我们会为每次迭代提供代码。为了便于讨论,章节中包含了代码片段。示例管理器可以从http://equinoxosgi.org上获得,其中包含每章的完整代码,允许你独立分步执行、浏览代码或者阅读文字。

你好,Toast(第4章)——该教程从一个空的工作空间开始,为你展示如何创建一个简单应急应用——在应用中,只要安全气囊展开,GPS位置将被读取并通过发出紧急呼救信号加以显示。这个简单例子随后被划分成三个bundle,其原理和所用工具都将一一阐述。在本节最后,将展示一个基于OSGi bundle集合的运行应用。

服务(第5章)——本章视线将转移到bundle概念之外,展示服务概念和bundle间的相互协作。除了以代码库的方式,bundle还可以通过OSGi服务注册中心来注册服务,从而允许其他bundle在非紧耦合的情况下使用他们提供的功能。

动态服务(第6章)——本章,在运行系统的生命周期中,我们将介绍bundle和服务可以动态增加和删除的概念。动态行为是基于OSGi系统的一个重要特点,也是你完成的许多设计和实现中的重中之重。在这部分讨论中,我们首先介绍OSGi服务追踪器(Service Trackers),随后一起回顾一个用于服务管理的第三方工具集(即服务激活器工具集,SAT)。最后,我们介绍OSGi声明式服务(DS)。教程剩余部分均采用了DS。在本节的最后,Toast中也有了此种场景下的动态特性。

客户端/服务器端交互(第7章)——此时Toast只是作为一个独立的OSGi应用运行。为了完整实现应急应用的场景,我们需要一个控制中心来接收紧急通知。本章中,我们将实现该控制中心,并将其作为一个单独的OSGi系统。我们使用HTTP来进行客户端系统和控制中心之间的通信。本章最后,Toast运行于独立的机器上,应急应用可以向控制中心发送紧急消息。

测试(第8章)——尽管此时Toast的领域逻辑稍微有些复杂,但我们将为已有的功能编写测试用例。本章使用EasyMock和JUnit来测试应急应用场景中的领域逻辑,以证明当领域逻辑以OSGi方式明确分隔后,创建一系列自动化测试用例的壁垒将大大降低。我们也将展示如何编写基于OSGi系统的测试用例。

打包(第9章)——现在是时候剪断连线并导出Toast了,这样Toast就可以在工作空间之外运行,也可以分发给其他人。在本章中,你将学习如何从你的工作空间构建、发布、压缩签名bundle,或如何导出bundle。我们也将展示如何与其他预构建bundle相结合,并最终分发到你的系统。

可插拔服务(第10章)——在我们的应用中,此时的Toast中只有一些模拟的设备。在本章中,我们增加一个设备模拟器,它有一个简单的Web用户接口,允许你仿真操作车辆设备(例如GPS和安全气囊),从而可以与Toast的子系统交互。本章将展示如何构建你的系统,使其可以针对相同的服务支持可插拔的替代实现。

可扩展的用户接口(第11章)——从终端用户的视角来看,到目前为止Toast繁琐复杂,用途寥寥。在本章中,基于图形用户接口,我们增加了一个标准小部件工具集(SWT),从而允许用户操作安装好的Toast客户端子系统。我们也增加了对音频和气候控制的支持,并集成了谷歌地球来支持导航地图和向导。这些附加功能展示了一些有趣的OSGi概念,我们也将一一叙述。

动态配置(第12章)——Toast具有高度可配置性。在本章中,通过示例,你将掌握如何使用OSGi配置管理(OSGi Configuration Admin)服务来管理可配置性。我们向Toast中增加一个新的应用,来追踪车辆的位置并定期向控制中心报告。追踪应用使用了OSGi配置管理服务,来决定报告周期。

Web Portal(第13章)——在本章,我们增加一个控制中心的Web UI。Web UI自身是相当简单的,但我们创建了一个可扩展的portal,来展示如何有效使用声明式服务和白板模式。

通过p2进行系统部署(第14章)——基于OSGi系统的一个重要特点是其部署的灵活性。远程信息管理系统尤其受益于远程管理软件及信息的能力。本章通过从Toast系统中安装、配置、更新和移除功能,介绍和展示如何使用Equinox p2预配置平台。

3.3 开发环境安装

本书中的代码使用Eclipse的发行版本Galileo SR1进行开发和测试。我们可以从http://eclipse.org/downloads上获取。因为Eclipse是一个工具平台,所以不同的配置都是可用的。对于构建基于bundle应用的用户,Eclipse团队特意将“Eclipse面向RCP/插件开发者”包与工具配置集成在了一起。不用顾及其名称,它其实是一个编写OSGi bundle的综合工具集。一般而言,任何包含Java开发工具(JDT)的包或者插件开发环境(PDE)都可以用来开发。

对于各种各样的机器配置,每个包都是可用的,并且在全球都有镜像。请选择合适的包、平台和镜像,并下载相应工具。

下载好Eclipse之后,选择解压文件的位置。在本例中我们假设解压到c:\ide

获取Java运行环境

下载Eclipse不包含Java运行环境(JRE)或Java软件开发工具包(SDK)。许多系统中已经含有可使用的JRE。如果你的系统中没有,请前往http://eclipse.org/downloads/moreinfo/jre.php,自行下载合适的JRE。

完成本书的开发工作,有一个Java SDK(有时称为JDK)会十分方便,因为它包含了许多Java源代码,便于调试,同时具有诸如jarsigner的之类的实用工具。

为启动Eclipse,可以运行Eclipse应用启动器(eclipse.exe或者eclipse,取决于操作系统)。Eclipse启动后,会弹出工作空间位置的提示。工作空间是存储开发构件(artifacts)的地方。一般我们将工作空间设置到与Eclipse安装位置隔离的地方,这将简化对多个工作空间和改变Eclipse版本的管理。我们推荐将默认位置设为用户目录(例如:c:\Documents and Settings\Administrator\workspace)。在一开始,这会是一个不错的选择。

3.4 示例代码

正如前文所述,Toast设置完成后会包含很多bundle。随着教程的逐步深入,其中许多bundle发生了大量演变。这样一来,在相关集合中管理相同bundle的不同版本将变得相当复杂。为了解决此问题,我们提供了示例管理器(Samples Manager)工具,它可以用来管理示例代码,并在示例之间进行切换。

示例管理器包含每个示例的所有代码和资源。为了安装示例管理器,运行Eclipse IDE并按如下步骤操作。

  • 使用Help > Install New Software…打开Software Updates对话框。
  • Available Software页面中点击Add…按钮增加一个新的软件站点。
  • 在对话框中,输入本书软件网站的位置 http://equinoxosgi.org,并点击OK。
  • 展开Equinox OSGi Book站点的树,并选择Samples Manager。选择最新的版本。(我们可能需要取消对Group Items by Category选项的勾选才能看到版本号。)
  • 点击Next并浏览随后的向导页面,仔细阅读并接受许可和警告。安装示例管理器被后,会出现重启对话框。选择Restart。

3.4.1 在章与章之间切换

安装示例管理器之后,主菜单栏上将出现OSGi/Equinox菜单。选择OSGi/Equinox > Samples Manager运行该工具,将出现示例管理器的视图,如图3-1所示:

http://assets.osgi.com.cn/article/7289495/2.jpg

图3-1 示例管理器

列表列出了本书中含有关联示例代码的所有章节。请注意,某些章节会有多个示例。选择一个示例,在工具栏上点击Import,或者通过右键菜单加载与所选示例相关的工程到工作空间里。

应用示例管理器的目的之一,是确保可以轻松流畅地在示例之间切换,此外还可清除相关历史记录。如果出现问题,只需重新加载即可。同样,示例管理器会在加载新工程之前,删除先前加载的所有示例工程,也会清除与示例相关的启动配置,以确保工作空间只会包含一个示例工程,并且处于已知状态。

内容可能被丢弃

即使已进行过修改,每切换到一个新示例时,示例管理器也会删除旧的示例工程。所以中间结果可能会被丢弃。

Samples Manager视图会高亮显示已经加载的章节,以提醒你工作空间里的内容。示例管理器的帮助文档包含最新的操作说明和提示。

3.4.2 比较

示例管理器也支持对示例的工程集合比较工作空间。跟随教程学习时,这是非常有用的。例如,当你阅读第3章时,可能发现有一些功能不能正常工作,或者有些步骤尚不清晰。此时,把工作空间与第7章的示例进行比较,你会了解到还需要做什么,或者哪些设置与预期的输出不符。

同样,我们可以有选择地加载部分解决方案到工作空间里。许多章节都需要一些资源集合或者大量的代码,而这些你又不希望自己去创建。这时可以使用示例管理器的比较工具,通过Copy into Workspace操作来选择文件和文件夹,并拷贝它们到工作空间里, 如图3-2所示。

http://assets.osgi.com.cn/article/7289495/3.jpg

图3-2 比较示例5与示例6.4

请注意,比较编辑器只能对发生变化的文件和那些只存在某处的文件进行区分。在页面下方,比较编辑器会高亮显示文件发生变化的部分,如果一个文件未存放在工作空间中,但存放于比较章节中,会显示一个减号(-)。与之相反,如果一个文件只在工作空间中存在,会显示一个加号(+)。所以在本示例中,当切换到示例6.4时,Bundle-Activator头标识被移除,而Service-Component头标识被添加。

请思考这是退步吗?

有些读者可能认为这是退步。但请思考一下,相对于已选的其他示例,通过比较编辑器,工作空间中的内容已一目了然。

3.5 目标平台设置

在编写代码之前,需要设置工作空间的目标平台。目标平台是一系列bundle的集合,包含编译代码依赖的bundle和将用于创建系统的bundle。此目标与碰巧组成了Eclipse工具的bundle不同。在我们的示例中,此目标只包含了用于实现Toast的大部分Equinox bundles。我们可以在不影响工具的情况下,增加和删除目标中的bundle.

设置IDE的目标

PDE默认使用Eclipse的IDE bundle作为目标平台。在Toast的初始阶段,这样方便快捷、功能丰富,但很快操作起来不太方便。因此,我们推荐使用一个不同的目标平台。

PDE包含了定义和管理目标平台的综合支持。我们安装的示例管理器也包含了一个适合本书示例的预定义目标。为了快速开始和运行,可以使用示例管理器加载目标。你也可以从零开始装配自己的目标定义。我们在接下来的章节中将描述这两种工作流程。

最终,Toast将拥有客户端和服务器端两部分。在示例中,我们将增加图形UI并进行一些测试。该目标必须具有这些活动需要的所有支持bundles。总地来说,需要以下四个工具。

  • Equinox SDK——Equinox团队集成了一个一体化SDK,其中包括所有的Equinox bundles及其源代码,一些支持bundle,诸如Jetty和Apache组件。这是Toast的核心内容。

  • RCP SDK——在Toast的后期,我们将增加图形UI。尽管从技术角度来看,UI不会成为Eclipse RCP应用,但它将使用Eclipse SWT。我们也将使用来少量自于基础Eclipse平台的实用bundle。这是最简单的部分,只需要将整个RCP SDK加入到目标中。

  • Delta包——Equinox支持许多不同的硬件和操作系统平台。可执行的二进制和图形库都依赖具体平台。为简化起见,Eclipse团队集成了一个delta包,其中包括平台所需的基本的Eclipse构建部分。delta包用于导出和构建Toast。
  • 测试材料——在第8章中,我们使用诸如JUnit和EasyMock等库。这些库也需要在目标中。

3.5.1 预定义的目标

示例管理器随带了一个便利的目标,包含上述所列的所有组件。请执行如下步骤来加载预定义目标。

  • 如图3-1所示,使用示例管理器工具栏上的Load Target入口来完成初始化目标的加载。当目标内容被拷贝到工作空间时,将显示一个进度对话框。进度完成后,将创建一个名为ToastTarget的工程,包含目标定义和其他目标内容。
  • 打开Target Platform首选项页面,Window>Preferences>Plug-in Development>Target Platform,找到名为Toast Target的入口。选中该入口旁边的复选框,点击Apply或者OK来使用该Toast目标。

不要通过目标编辑器设置目标

目标被定义在.target文件中。Toast目标被定义在toast.target文件中,该文件存在于刚刚加载的ToastTarget工程中。我们将在下节讨论如何编辑该文件,但是这里你需要明白在Galileo SR1(2009年9月)的PDE中有一个bug。

打开一个目标文件,目标编辑器会尝试解析它的内容。为此,它会打开在目标中的所有bundle。Toast目标引用了一些eclipse.org中的远程软件仓库,从而可以使用其中的一些bundle。对网络来说,这样导致的结果是当目标文件被打开后,PDE开始从远程服务器下载目标的组成成分,这些内容可能数以兆计。在很多场景下这是个优势——对内容预缓存。然而,会有一个bug存在。

当编辑器正在解析时,不要在目标编辑器中点击Set as target platform链接。否则,会导致紊乱并最终无法加载目标定义。

如果误点了Set as target platform链接,将弹出一个报告锁定的对话框,也可能弹出一个同步错误的对话框。当这种现象出现时,请关闭目标编辑器并重启Eclipse。然后按照步骤使用目标首选项来加载目标,也可以打开编辑器,在点击链接之前等待其完成解析。

工作空间中的目标

本节描述的工作流程,会导致Toast目标中至少有一部分会存在于工作空间里的某一工程中。从某种意义上说,这很奇怪——目标难道不是针对整个工作空间吗?!将目标的内容作为资源,并可放入源代码控制和共享,反倒带来很大的便利。在本书示例开发以及产品团队的工作中,在工作空间中创建一个工程,并通过软件配置管理(SCM)系统来控制其内容和目标定义是非常普遍的做法。团队新成员可以很容易地签出该目标。当某个成员改变目标,其他人只需要更新即可。以上是对随后章节描述的目标平台软件站点设施的补充。

3.5.2 定义目标平台

我们推荐使用前面章节介绍的预定义目标,因为它会让后面添加目标时变得更简单。但有些时候,你需要为自己的工程定义自己的目标。本节就描述了如何来定义目标。如果你已经完成预定义目标并开始运行了,请跳过本节,或将本节作为以后查阅的参考。

目标平台就是一系列bundle,以及来自各种位置的多个特性。其内容来源包括如下几部分。

目录(Directories)——指定一个目录加入到目标中,该目录下能找到的所有bundle和特性都会被加入到目标中。通过从Web上(例如,从eclipse.org)下载归档文件,可以获得包含bundle的目录。

安装(Installations)——指定一个已经存在的Eclipse安装中的目标,其中的所有元素都会被添加到目标平台中,包含链接的文件夹、快捷方式(drop-in)以及其他组成该安装的bundle和特性。

特性(Features)——增加特性与增加目录相似,但是需要从目录下找到的特性中选择一个子集。被选择的特性所对应的bundle也会被加入目标。

软件站点(Software sites)——在全世界有许多软件仓库。增加一个软件站点,你将辨别出加载的bundle和特性来自哪个软件仓库。

预定义的Toast目标在其定义中使用了目录和软件站点。接下来,我们将带你了解一些用于创建目标平台的步骤。在前面章节的侧边栏中,我们讨论了在工作空间中创建目标。在此,我们将阐明其方式。如果你不希望创建于此,可以根据自己的需求设置目标内容,但是目标定义的文件仍然会存在与工作空间中。

  • 使用File > New > Project… > General > Project创建一个简单工程。我们已经将目标工程命名为为ToastTarget
  • 使用File > New > Other > Plug-in Development > Target Definition向导创建一个目标平台定义。
  • 输入目标文件的名称,并将其放置于新的工程中。 注意在向导的底部,有一些用于初始化的新目标的选项。选中Nothing选项,因为我们要从零开始构建此目标。在其他场景下,你可能希望使用其他地方的内容来为新目标做好准备。
  • 点击Finish来完成向导,并在新的目标定义上打开目标编辑器,如图3-3所示。

http://assets.osgi.com.cn/article/7289495/4.jpg

图3-3 目标定义编辑器

在编辑器中,你可以为目标定义添上一个有用的名称,但是真正引人关注的部分是Location。为了Toast目标,我们将需要为delta包增加一个目录,为Equinox和RCP SDKs增加一个软件站点。首先让我们来做delta包。

  • 从Eclipse工程的下载站点http://download.eclipse.org/eclipse上下载delta包。在给出的选项中选择Latest Release。(如3.5.1所述。)
  • 在下载页面中,从左边导航栏中选择Delta Pack。页面将滚动到delta包的下载链接。请注意,这里只有一个链接。因为根据定义,它是独立于平台的所有部分。选中链接并保存归档文件到本地驱动器上合适的位置。
  • 下载完成后,在目标工程里创建一个名为delta.pack的新文件夹,导入下载的内容到文件夹File > Import… > General > Archive File中。
  • 在目标编辑器的Definition页面里,点击Add…并选择Directory。点击Next
  • Add Content对话框中,点击Variables…并从列表中选择workspaceloc。现在,添加工作空间的路径到delta包的内容里。例如,假定你的工程命名为ToastTarget,其位置应该如下所示:${workspac eloc}/ToastTarget/delta.pack/eclipse

接下来,我们将增加一个软件站点并获取Equinox和RCP SDKs。

  • 在目标编辑器的Definition页面,点击Add…,并选择Software Site。点击Next
  • 在随后的Add Software Site向导页面,在Work with下拉框中选择Galileo。如果存在一个更新的发布仓库可用,你便可以直接使用。如果没有你所期望的站点,则点击Add…按钮,并输入该站点的NameURL Location。例如,Galileo的站点是http://download.eclipse.org/releases/galileo
  • 站点一旦被选中,向导的内容区域将被填充(如图3-4所示)。通过展开EclipseRT Target Platform Components分类,或者在内容之上的过滤区域输入它的名称,都可以实现对Equinox Project SDK的选择。
  • 为了添加RCP SDK,你需要取消对内容区域下Group by Category复选框的选择,然后在过滤区域输入RCP。选择Eclipse RCP SDK

多选或许不能正常工作

在Eclipse的某些版本中有一个bug——使用过滤器时会清空当前的选择。你可能需要单独添加SDKs,或者不使用过滤器。

  • 注意:必须取消对向导左下方“Include required software”复选框的选择。如果不这么做,会导致目标臃肿,对于Toast的场景来说,可能会导致不能工作。
![http://assets.osgi.com.cn/article/7289495/5.jpg](http://assets.osgi.com.cn/article/7289495/5.jpg) **图3-4 Galileo软件站点内容**

点击Finish后,PDE随即解析该目标。因为要从软件站点下载相关内容,所以将占用一段时间。解析完成后,请看一下目标编辑器中的Content页面。你将看到与图3-5所示的编辑器相似的东西。请注意,读者可以对测试相关的bundle进行补充,以此作为进一步的练习。基本上,你只需添加一个目录到目标定义和目标中,然后收集想要的bundle和特性。一旦完成目标定义,保存该文件并点击右上方的Set as Target Platform

http://assets.osgi.com.cn/article/7289495/6.jpg

图3-5 Toast目标内容

3.6 通过示例进行学习

要理解如何通过编程来实现一个系统,最有效和有用的方式之一是浏览示例。但我们无法对此充分详述,否则其所占篇幅过多以至于本末倒置。但是,有许多可以使用的快捷方式和机制能够帮助你学习代码。以下是一个工作空间导航操作的简短列表,也是我们平时常常会接触到的。

Navigate > Open Type… (Ctrl+Shift+T)——按照你输入的名称,打开对应的Java类型。支持通配符、区分大小写的首字母缩略词,以及驼峰命名法。使用此方法,可发现某个类型位置或者其是否存在。

Navigate > Open Resource… (Ctrl+Shift+R)——按照你输入的名称,打开对应的资源。支持通配符、区分大小写的首字母缩略词,以及驼峰命名法。使用此方法,可发现资源和它们的位置。

Open Plug-in Artifact (Ctrl+Shift+A)——打开你输入的构件,这些构件用来定义插件或者bundle元素。例如,输入一个扩展的ID,定义扩展的plugin.xml会被打开。

Ctrl-3——展示出一个缩合的列表,其中包含命令、视图、首选项和其他工具。简单输入与你所需相关的文字,该列表就会被过滤。例如,输入targ会找到目标首选项页面。

Navigate > Quick Type Hierarchy (Ctrl+T)——对当前Java编辑器中选择的类型,展示出其类型层次结构。例如,如果选择了一个类型,一个标准的类型层次结构会被打开。如果选择了一个函数或选择在函数内,层次结构体系中所有该函数的实现都会显示出来。再次按Ctrl+T会反转该层次结构。

Search > References > Workspace Ctrl+Shift+G)——在Java编辑器中,搜索所选择的Java元素的引用(例如类型、函数、字段)。Ctrl+Shift+U可以实现同样的搜索,但只限于本文件。

Navigate > Open Declaration (F3)——在当前Java编辑器中,打开所选择Java元素对应的声明。

OSGi系统松耦合特质非常明显,这也是其最重要的特点!然而,这会导致我们很难理解不同部分是如何交互的。PDE提供了许多工具和机制,用于分析其如何相互连接。Plug-in Development透视图(Window > Open Perspective > Other… > Plug-in Development)包含了一个插件视图。从该视图中,你可以轻易地分析出相互的依赖和引用。在PDE插件编辑器中,你能发现扩展点之间的相互连接,分析出在多个扩展中定义的类,并浏览扩展点文档。

在Java搜索中添加类型

在插件视图中,选择所有插件,并使用右键菜单的Add to Java Search入口或者在视图工具栏,向Java搜索范围中添加所有已知的插件。这是一个行之有效的方法,因为Java搜索范围只是工作空间里的工程和它们所依赖的工程。这意味着如果打开一个空的工作空间,并尝试打开一个类型,使用Ctrl+Shift+T,类型选择对话框将是空的。通过把目标平台的所有插件添加到搜索范围中,你可以更容易地分析出工程里没有引用的示例代码和类。

3.7 总结

一旦设置成功,Eclipse和PDE会使得创建和运行OSGi系统变得简单。这里详细描述的设置很全面,你可以使用该IDE在不同的工作空间里工作,目标平台可以独立于IDE或工作空间进行更新,在不影响工作空间或者目标平台的情况下,IDE也能自动更新。

通过添加示例管理器,你可以查阅任意章节,快速设置工作空间。你也可以验证教材所述步骤,对已学知识进行总结,自行制定学习计划。


rookiecc 2015-04-18 10:26

我在看到这本书的第五章 服务的时候AIRBAG需要引入org.eclipse.core.jobs 的bundle 但是运行后发现<br>Unresolved requirement: Import-Package: org.eclipse.core.runtime.jobs 请问这是为什么

顶(0) 踩(0) 回复

wensiqun 2014-02-28 11:05

回复liuwei: 你可以把eclipse3 plugin里面的org.eclipse.update.ui 拷到4的plugins里面

顶(0) 踩(0) 回复

liuwei 2014-02-12 09:01

Samples Manager安装不支持eclipse 4吗?我安装时提示失败:<br>Cannot complete the install because one or more required items could not be found.<br> Software being installed: OSGi and Equinox Samples Manager 1.0.0.201003071427 (org.equinoxosgi.book.tools.feature.feature.group 1.0.0.201003071427)<br> Missing requirement: org.eclipsercp.samplings 1.0.2.201003071427 (org.eclipsercp.samplings 1.0.2.201003071427) requires 'bundle org.eclipse.update.ui 0.0.0' but it could not be found<br> Cannot satisfy dependency:<br> From: OSGi and Equinox Samples Manager 1.0.0.201003071427 (org.equinoxosgi.book.tools.feature.feature.group 1.0.0.201003071427)<br> To: org.eclipsercp.samplings [1.0.2.201003071427]

顶(0) 踩(0) 回复

liuwei 2014-02-12 09:01

Samples Manager安装不支持eclipse 4吗?我安装时提示失败:<br>Cannot complete the install because one or more required items could not be found.<br> Software being installed: OSGi and Equinox Samples Manager 1.0.0.201003071427 (org.equinoxosgi.book.tools.feature.feature.group 1.0.0.201003071427)<br> Missing requirement: org.eclipsercp.samplings 1.0.2.201003071427 (org.eclipsercp.samplings 1.0.2.201003071427) requires 'bundle org.eclipse.update.ui 0.0.0' but it could not be found<br> Cannot satisfy dependency:<br> From: OSGi and Equinox Samples Manager 1.0.0.201003071427 (org.equinoxosgi.book.tools.feature.feature.group 1.0.0.201003071427)<br> To: org.eclipsercp.samplings [1.0.2.201003071427]

顶(0) 踩(0) 回复
查看评论