BndTools 为在 Eclipse 中进行 OSGi 开发提供支持

阅读数:3151 2011 年 12 月 2 日

话题:Java语言 & 开发

Neil Bartlett 最近发布了BndTools 1.0.0,它是为 Eclipse 所用的 OSGi 开发环境。这个工具通过其 github 代码库提供了源代码,你也可以从Eclipse Marketplace直接把它安装到 Eclipse 运行时中。

BndTools 为我们提供了一种使用 Eclipse 开发 OSGi bundles 的方式。它没有通过直接编辑Manifest.MF的方式定义依赖关系,而是使用Bnd文件基于 Bnd 工具驱动工具链(toolchain)。它还提供了介绍性的教程。此外,BndTools 还具有自动化语义版本控制功能(automated semantic versioning),它会将已构建的组件和之前发布的组件相比较,让算法来决定是否对大、中、小三种版本号进行升级,而不是让用户人为决定。

InfoQ 抓住了和 Neil Bartlett 会面的机会,询问他为何要创建 BndTools:

Neil Bartlett:我曾经做过很多 OSGi 的培训,发现 OSGi 开发工具总是存在一个问题,那就是过于笨重,初学者很难理解和使用。由于我具备一些开发 Eclipse plug-in 的经验,所以就开始构建一些小工具,让我和学生们的工作更轻松。随着时间的推移,这些工具成为比较完整的、集成的 OSGi 开发环境。

现在我会使用 BndTools 来完成所有的 OSGi 开发,并且,由于 Eclipse plug-in 本身也基于 OSGi,所以我甚至使用 BndTools 来完成它自身的开发。

InfoQ:它与 Bnd 有什么关系呢?

Neil Bartlett:对于构建和分析 OSGi bundle 来说,Bnd 是一种极为强大的底层工具。它是由 Peter Kriens (OSGi 联盟的技术总监)开发的,OSGi 联盟使用它来构建自己的 API 套件、兼容性测试以及引用实现的 bundle。作为一种底层工具,它很容易继承,并且可以直接从命令行调用,可以被 ANT 任务所使用,也可以嵌入到 Maven 和 IDE 中。

BndTools 使用 bnd 作为它的“引擎”。所有主要功能都是 bnd 本身提供的,而 BndTools 只是描述什么时候应该调用 bnd,并以更好的形式来展现结果。由于很多其它工具也集成了 bnd,所以 bnd 所使用的描述文件几乎已经成为一种事实上的标准,这意味着 BndTools 开发者很容易与使用其它工具的开发者协作,也可以在选择其它工具的时候很容易地完成迁移。

InfoQ:BndTools 与 Eclipse 的 PDE 相比怎么样?

Neil Bartlett:Eclipse PDE 是另一种基于 Eclipse 的 OSGi 开发环境。BndTools 没有以任何方式重用 PDE,但是 BndTools 和 PDE 都是基于 Eclipse 的 Java 开发工具集(JDT)构建的。

PDE 所遵循的开发哲学和 bnd 以及 BndTools 不同,它被称之为“manifest 优先(manifest first)”。在 PDE 中, 你需要直接编辑 MANIFEST.MF 文件,它会直接集成到 bundle 中,而不需要任何后续处理。我们的开发哲学是,MANIFEST.MF 应该当作编译器输出来对待:也就是说,应该使用更简单的源代码来生成这个文件。这非常重要,因为完整的 MANIFEST.MF 文件中会包含很多重复的信息,或者应该直接从 Java 代码中继承的信息,比方说包一级的依赖关系列表。手动编辑这样的信息是个苦力活,而且容易出错。

InfoQ:在 JRebel 和基本的 Java 项目之上使用 OSGi 有何优势?

Neil Bartlett:JRebel 是一种很强大的工具,它可以让我们在开发过程中更快地重新部署代码,但是不管是在运行时还是在构建时,它都没有提供任何一种模块系统(module system)。OSGi 通过封装和受约束的、明确的依赖关系强制指定了模块边界。OSGi 的目的就是要帮你改善应用程序的架构,创建出可重用的组件,而 JRebel 是要尽可能快地把你的代码从 IDE 中提取出来,然后部署到 Java EE 应用程序服务器中。

同时,OSGi 还具有模块动态热交换(dynamic hot-swapping)的特性,该特性已经足够有效,所以我认为开发 OSGi 程序的时候 JRebel 并不是特别有用。BndTools 对此也有帮助:当你保存了 Java 源文件的时候,代码就会重新编译、打包到 bundle 中,并且推送到正在运行的应用程序中。

InfoQ:BndTools 能够与其他构建环境——像 Maven 和 Ant/Ivy——集成吗?

Neil Bartlett:BndTools 的“本地”构建系统是 bnd 本身,它支持 Apache Ant 同时构建多个项目,这也是 OSGi 联盟构建他们的 1300 多个 bundle 的方式。Bnd 拥有插件化的库系统(pluggable repository system),这让我们可以使用任何一种后端的库技术,包括 Ivy。

对于 Maven 用户来说,最流行的 OSGi 开发方式就是使用 Maven Bundle Plugin,它是另一种集成了 bnd 的工具。BndTools 通过这个插件以及 M2Eclipse 与 Maven 集成。在这种情况下,M2Eclipse 会负责管理构建依赖关系(显然是在 POM 中),并负责实际上构建 bundle 的工作,而 BndTools 会提供编辑和分析 bundle 描述符以及依赖关系的方式,还提供了设置和执行运行配置(run configurations)的方式,这就是它的价值所在。

InfoQ:想要开始使用 BndTools,有没有教程可供使用?

Neil Bartlett:有的,你可以在http://bndtools.org/doc/tutorials/找到。

InfoQ:你能使用 BndTools 编写 Java 源代码,而不需要在编码的时候依赖 OSGi 吗?

Neil Bartlett:可以,BndTools 希望你可以使用 OSGi 声明式服务以 POJO 样式编写组件,而不依赖于 OSGi。这样,这些组件就可以在 OSGi 之外进行单元测试,并在非 OSGi 的生产环境——像 Sprint 或 JavaEE——中使用。

你甚至还会发现 BndTools 具有配置模块和分析依赖关系的功能,即便你还没有做好部署到 OSGi 中的准备,它们对于提高代码的模块性很有帮助。例如,我们可以使用 PojoSR 提供类似于 OSGi 的服务注册,它会支持 OSGi 的大多数特性,只是不支持在 OSGi 中必须要使用的模块边界。这样它可以帮助你将遗留应用程序迁移到 OSGi,并且在 BndTools 中开发,这样你就能够看到应用程序还差多少才能够完全运行在完整的 OSGi 上。

InfoQ:Bnd 可能会支持其它 IDE 吗,像 IntelliJ 和 NetBeans。

Neil Bartlett:BndTools 本身与 Eclipse 联系非常紧密,不会支持其它 IDE。然而,其他 IDE 也开始整合 bnd,让它们更易于互操作。例如,IntelliJ 就有 Osmorc 项目,它会使用 bnd,并且在多种方式上与 BndTools 的开发哲学类似。我已经与 Osmorc 的首席开发者合作,让开发者能够更轻松地使用各种 IDE 来协同工作。

在我上次询问的时候,NetBeans 项目还没有计划直接支持 OSGi 的开发。但是,NetBeans 非常专注于 Maven,使用 NetBeans 的 OSGi 开发者通常会使用 Maven Bundle Plugin,之前我们也曾提到,它也是 BndTools 最初集成 Maven 的方式。

你可以使用Eclipse Marketplace来安装 BndTools。

查看英文原文:BndTools provides OSGi Development in Eclipse