OSGi框架是一个将系统和服务标准模块化的一个平台,具有如下的优点:
a) 您可以在不重启容器的情况下,动态地安装、卸载、启动和停止您的应用程序中的不同模块;

b) 对于您应用程序中的某一特定模块,容器可以同时运行该模块的多个版本;
c) OSGi为开发嵌入式应用、移动应用、富互联网应用(RIA)提供了非常优秀的基础架构。

目前为止,开放源码的OSGi容器有:
Equinox容器、Apache的Felix、Knoflerfish
参考地址:http://developer.51cto.com/art/200903/112409.htm


Equinox  实现OSGI
参考地址:http://developer.51cto.com/art/200909/152209.htm

Equinox项目是Eclipse开源组织提供的OSGi框架的实现。OSGI的核心是bundles,下面通过在Eclipse中建立四个Bundle,来呈现bundle的含义。

创建四个bundles(在Eclipse中建立四个Plug-in工程):
SayHello Bundles:包含一个唯一的接口sayHello(),并将此接口暴露,以便其他工程引用。具体
                                   方法是在MANIFEST文件中添加如下语句:Export-Package: org.osgi.demo.say,此   
                                   包含了接口sayHello()
BodSays Bundles:实现接口sayhello()
                                  在MANIFEST文件中添加如下语句: Import-Package: org.osgi.demo.say
KentSays Bundles:同上
SayHelloService Bundles:提供了说hello的机会,是一个具体的服务应用。具体调用哪个Bundle,
                                   是由运行时 动态决定的。

启动OSGi,输入命令ss查看所有的bundles:

如上就是我们新建立的四个Bundles,而且都是出于活动状态。

 

OSGI包之间的依赖关系:
在OSGI中,每一个OSGi Bundle的类文件可分为私有的、引入的和暴露的三种。

Exported Classes是以整个包的形式暴露的,在SayHello中暴露了包含接口sayHello的package中的
所有接口。其他的三个Bundles都将引入该包。这就是OSGI中的面向服务的通信方式。

 

Felix实现:

将Jetty嵌入到Felix中,以支持JSP和Servlet:
http://www.strawren.org/post/10.html

Felix的动态化的实验:
关注点:即插即用、热部署、即删即无,这正是OSGI的优点。

在开发web应用程序的时候,有两种方法可以使web应用程序与OSGI一起工作:
1.在应用程序服务端嵌入OSGi
2.在OSGi运行时,嵌入应用服务器端
在这里我们是利用第二种方法,将应用服务端Jetty嵌入到OSGI的运行时的Felix中。

首先从Google代码库中checkout HelloWorldWebJSP 工程,使用如下命令:
svn checkout http://kcode.googlecode.com/svn/trunk/osgi/HelloWorldWebJSP当然在测试以前,你还必须要有felix的jar包,下载地址为:
http://felix.apache.org/site/downloads.cgi
测试:
进入到HelloWorldWebJSP所在目录(假设felix和 HelloWorldWebJSP在同一个目录下),

然后输入命令:java -Dfelix.config.properties=file:./config.properties -jar  /felix-framework-2.0.5/bin/felix.jar

不出意外,嵌入了Jetty的Felix就会成功启动,可以练习如下命令:

PS:列出所有的Bundles

 如上所示,共包含11个Bundles。这些在工程检出的时候已经创建完成。我们可以将其删除,从
一个“干净”的工程开始。方法很简单:
依赖的包均包含在lib目录下(web包是用Ant工具编译而成的):

 

 

 

 

install [jar path] :将指定的jar包安装

uninstall[ID]:卸载指定的bundle

start [ID] / stop[ID]:开启/停止 一个bundle

我们可以在Hello World Web bundle启动的情况下,点击如下网址http://localhost:8380/,测试结果。

热部署:对web工程里的servlet或Jsp进行适当的修改,然后用Ant重新编译,在不重新启动Felix的情况,对新编译的web包进行热部署,步骤如下:
stop 14
update 14
refresh 14
start 14