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