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

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

你可能感兴趣的:(BndTools为在Eclipse中进行OSGi开发提供支持)