前言

OSGi是当前的一个热门话题,所有主流的Java应用服务器提供商都选择了OSGi作为他们的基础运行时,Eclipse至少在过去5年内一直使用OSGi作为对于模块化的基本描述与基本运行时,而不计其数的系统也在嵌入式和“界面后台”场景中使用了它。所有这些对OSGI的应用都有着充足的理由。

Eclipse作为工具平台的成功是OSGi所尊奉的强大模块化特性导引的直接结果。它使开发者能够游刃有余地处理变更,让团队变得更加灵活,组织得以改变软件开发方式,进而促进生态系统的实现和运行。这些优点也同样可以在其他任何软件领域内实现。

OSGi的主要规范非常简洁——只有27个Java类型。它设计精良,特别适于在实践中的实现与使用。不过,选择OSGi也并非没有任何挑战:毫无疑问,实现高度模块化和动态的系统是非常困难的。俗话说得好,天下没有免费的午餐。有人已经指出OSGi复杂晦涩。在多数应用场景中,复杂是主要问题——想要模块化或动态性,就会出现这样的问题,但这不是原因。模块化处理已有的单层系统尤其具有挑战性。

本书会着重强调这些主题并提供相关的知识、指导和最佳实践,以缓解OSGi的复杂性。我们重点讨论模块化、组件和动态性,并向你展示强化系统灵活性和敏捷性的技术。

尽管我使用OSGi已经很多年,参与过OSGi规范的撰写,也实现过Equinox(OSGi框架规范的参考实现),但在撰写本书的过程中,关于OSGi、Equinox和高度模块化的动态系统,我依然收获颇多。我们相信读完本书,你也定会大有收获。

关于本书

本书通过一个基于OSGi的远程信息管理和车辆管理系统示例Toast,为即将使用和已经使用OSGi的开发人员详细介绍了开发的所有步骤。

我们从零开始,将Toast开发成一个功能完备的客户端和服务器端系统。对于大部分开过车或运送过包裹的人们来说,这个领域是非常熟悉的。简单来说,远程信息管理涉及汽车中全部的电子设备——无线电设备、导航、车内的气候控制系统,等等。车辆管理系统则涉及对包裹和车辆在位置变更过程中的追踪与协调。

其中出现的一系列问题和机会使你接触到各种各样的主题:从模块化和组件协作,到服务器端的编程和打包,以及高度模块化系统的交付。我们创建了单独的客户端应用,单独的嵌入式服务器端配置,并对两者进行了动态增强。本书的这些知识和经验完全可以移植到你所在的软件领域中。

本书大致分为两部分。前半部分,即第一部分和第二部分,为介绍OSGi和Equinox做好铺垫,并提供了一份构建Toast的教程,逐步介绍如何将Toast构建成一个具有很多高级功能的车辆管理系统。教程内容撰写方式通俗易懂,不至使人彷徨困惑。另外,还分享了一些在开发应用和撰写教程的过程中,我们所经历过的陷阱和意外。

本书后半部分侧重于如何将该教程内容变成现实。编写原型和开发产品完全是两码事。为了使你脱离原型阶段,第三部分用了多个章节深入探究了完成这些工作的细节——改善和重构首个原型、定制用户接口、构建并交付产品。本部分可作为参考阅读,但仍介绍了少量的步骤示例和代码示例。我们想既深入研究,又要把大部分在社区中已报告的,以及在我们自己开发的专业产品中发现的主要问题都囊括进来。

最后一部分,即第四部分,则是单纯的参考资料。它涵盖了OSGi和Equinox的基本方面,并涉及了前面章节所没有涵盖的各种功能。我们也讨论了一些最佳实践和高级主题,例如集成第三方代码库和具有动态性。

OSGi尽管相对较小,但是非常全面。正因如此,单靠一本书不可能涵盖所有可能的主题。我们聚焦的功能和服务,都是我们在每天的开发过程中和系统中使用的,这些也许会在你的开发过程中起到一定的作用。

OSGi、Equinox和EclipseRT

OSGi社区非常有活力。至少有3个活跃的开源框架实现社区,有着许多使用者和扩展者。本书的绝大部分内容涵盖了对任何OSGi系统或实现可用的通用主题。在本书中,我们一直使用Equinox作为我们示例和讨论的基础,它是OSGi框架规范的参考实现。有时,我们会介绍一些只在Equinox下可用的特性和工具。通常,这些功能已经被加入Equinox来解决现实问题,而这些问题你也可能会遇到,所以有必要在此进行简要介绍。

贯穿本书,我们也介绍了编写和构建OSGi bundle的Eclipse插件开发环境(PDE)工具。PDE是综合的、有效的、成熟的工具,已经在OSGi环境中使用多年。如果你不使用PDE来创建基于OSGi的系统,或许你可以借此机会反省一下。

最后,Eclipse是工具领域的动力之源。它越来越多地被用于纯运行时、服务器端和嵌入式环境。这些工作已经融入到EclipseRT中。EclipseRT包含了许多在Eclipse下开发的技术,它们针对(或有益于)典型的运行时环境。这里开发的Toast应用已经捐献给Eclipse Exapmles工程,并成为EclipseRT技术的示例。我们鼓励你从http://wiki.eclipse.org/Toast上签出代码,以便更好地了解人们如何开发Toast,以及用Toast能做什么。

读者对象

本书面向一些Java开发者群体。你必须拥有一些Java编程经验,我们不会介绍Java的概念和语法。

对于OSGi和Equinox的新手,书中会介绍这些技术的起源,如何使用Eclipse OSGi bundle工具,以及如何创建第一个基于OSGi的系统。读者最好之前用过Eclipse,但这并不是必须的。

针对有开发OSGi bundle和系统经验的开发者,本书正式介绍了有助于创建使用OSGi的高度模块化系统的诸多技术和最佳实践——从服务协作方式,到服务器端的集成和作为发布工程组成部分的系统构建,以及部署和安装。

对于有经验的OSGi开发者,本书详细介绍了一些在Equinox中可用的特殊功能,并全面涵盖了一些有用的工具,例如声明式服务、buddy类加载、Google地球集成,以及一些能够使基于OSGi的系统在设计、编码与打包等方面比以前更容易的Eclipse bundle工具。

示例代码

在阅读本书的过程中,读者可以亲自试验。很多时候,可以按照书中的步骤进行试验,也可以编写自己的代码。本书附件下载中包含了每章的代码。获取和管理这些示例的指令在第3章中有所提及。通常,所有需要的资源都可以从http://eclipse.orghttp://equinoxosgi.org在线获取。正如前面提到的,Toast的简易版依然存在,成为了Eclipse的一个开源工程。具体参见http://wiki.eclipse.org/Toast

排版约定

本书使用下面的格式约定。

粗体:用于UI元素,诸如菜单路径(例如File>New>Project)、向导和编辑器中的元素。

楷体:用于强调和突出术语。

Lucida:用于嵌入在文本中的Java代码、属性名称、文件路径、bundle ID,等等。

Lucida粗体:用于突出代码示例中的重要行。

备注和扩展内容经常用于强调那些读者可能感兴趣,或者有助于读者使用或理解正文所述功能的信息。我们努力营造非正式的结对编程的效果,好像你与别人相伴而坐,随处都能获得及时的技巧提示。

反馈

本书的官方网站是http://equinoxosgi.org。附件信息和勘误表位于informit.com/title/0321585712。读者可通过book@equinox.org向作者报告在本书或代码示例中发现的问题和错误。我们非常期待你的改进建议和反馈。

目录