详解利用 JDK6 动态编译组件搭建 OSGi 运行时编译环境2013-09-18 IBM 蔡 敏但是我们知道,在开发 OSGi 环境下的 Bundle 时最麻烦的步骤之一就是搭建编译环境。即便利用 Eclipse 这样高效的 开发工具,由于 Bundle 个数的庞大以及同一 Bundle 的版本多样性,维护一个编译环境变得非常繁琐。常常我们需要对一 个 OSGi 的 Bundle 进行二次开发时,仅仅一个很小的改动都需要花大量的时间去搭建专为这套程序的编译环境。我们迫切 希望可以有一个运行时的编译环境来简化这些步骤,利用环境既有的依赖项来对代码进行编译。本篇文章介绍 OSGi 的运行特性,Bundle 间运行时的依赖方式以及 JDK6 所提供动态编译功能,接着一步步介绍如何利用这些特性搭建可以运 行时编译的开发环境,最后通过 IBM System Director 作为示例,将开发 Bundle 安装在上面上演示以给读者一个直观的 体验。本文假设读者具备一定的 OSGi 基础知识和 java 基础知识。读完本文后,如果读者有一个 OSGi 的运行环境和想要 编译的运行在这个环境上的 java 源代码,就可以自行搭建出利用这个运行环境编译出字节码文件出来以供发布及二次开发 使用的模块。图 1 描述了传统基于 OSGi 的应用程序架构:图 1. 基于 OSGi 的应用程序架构

要实现文章所介 绍的功能,应用程序只需满足如下系统需求:基于任意 OSGi4 的实现版本,如 Knopflerfish 或 Equinox。运行 JDK 版本 6.0 或以上。图 2 概括描述了本文所要描述的目的:图 2. 运行时编译环境模型

其中 Bundle1、2 等等分别是 OSGi 运行环 境中既存的 Bundle,即 OSGi 已经将它们对应的 jar 包或是字节码文件加载了进来。棕色框图则是我们要制作的 OSGi 运 行时动态编译 Bundle。用户输入 Java 源代码(以命令行或是文件形式)动态编译模块扫描所有 Bundle,将运行时环境里所有的 jar 及 class 文件作为编译时依赖保存。利用 JDK6 提供的动态编译组件进行动态编译编写自己的 JavaFileObject 对象,并且指定 StandardJavaFileManager 的编译目的地(这些都是 JDK6 动态编译组件 的相关内容会在后续详细说明),即可编译出 Java 字节码文件[ 可选 ] 发送 class 文件到指定邮箱完成整个运行时编译过程。接下来就让我们来看看怎样利用 JDK6 动态编译组件和 OSGi 提供的相关功能来搭建这个运行时编译 Bundle。不过在这 之前,还是有必要了解下 Bundle 之间的通讯方式。