首先我们要认识一下什么是OSGI,OSGI亦称Java动态模块,它的最大作用就是来帮助我们实现Java的模块化应用的。OSGI首先是一套规范,然后是一个容器,所以我们可以很容易地将其与JavaEE技术作对比,我们知道JavaEE的架构是分为一个容器和多个应用(即web项目)的,Tomcat、Jboss这些应用服务器就是容器,我们基于这个标准下编写的一些JSP和Servlet所构成的项目只需要部署到相应的容器之中,就可以运行良好;与JavaEE的这种架构类似,OSGI也由一个容器和多个插件(这个插件通常被称为Bundle)组成,我们只需要按照一定的规范将这些插件部署到容器之中,整个OSGI程序就可以运行良好,当然JavaEE和OSGI的最大区别在于,JavaEE的服务器和web应用通常是分开的不同web应用之间往往没有什么依赖,而OSGI的容器和插件通常要一起使用,插件和插件之间一般有依赖关系,所以JavaEE的服务器和web应用可以被看做是多个项目,而OSGI可以被看做是同一个项目的多个模块。
那么我们为什么要使用OSGI技术呢?或者说OSGI有什么优点呢?简单来说OSGI的使用可以让我们的大型应用更为稳定、更易于维护和修改。我们在通常的开发过程中,往往是依据模块来进行任务的划分的,但是每个模块的功能和依赖我们并没有一个统一的管理标准,随着项目的发展,这一问题会不断凸显,导致维护的成本升高,而OSGI技术为我们提供一个较为标准的模块维护格式,此外OSGI框架的一个优点是支持插件的热插拔和版本替换,有利于程序的稳定性和升级。
Apache Felix是OSGI技术的一个开源框架,类似的实现还有大名鼎鼎的Eclipse下的OSGI框架Knoflerfish等,Equinox,我们在这里使用Felix搭建OSGI环境。
首先在Apache的网站上下载Apache Felix的二进制发布版,在eclipse下建立一个Java项目,将Felix解压覆盖这个项目,然后将lib目录下的felix.jar加入ClassPath中,Felix的启动入口是其org.apache.felix.main.Main类中的main方法,我们可以自己在类中调用这个方法来启动整个容器。
启动后,控制台将显示:
Hello World!!
____________________________
Welcome to Apache Felix Gogo
g!
输入lb命令,回车:
START LEVEL 1
ID|State |Level|Name
0|Active | 0|System Bundle (4.0.1)
1|Active | 1|Apache Felix Bundle Repository (1.6.6)
2|Active | 1|Apache Felix Gogo Command (0.12.0)
3|Active | 1|Apache Felix Gogo Runtime (0.10.0)
4|Active | 1|Apache Felix Gogo Shell (0.10.0)
出现此界面说明OSGI框架已经启动,在这张表上显示的是OSGI框架下运行的所有插件和其状态。