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。
评论