OSGI概述以及各种具体实现

本文介绍了OSGi框架的特点及其在不重启容器的情况下动态管理模块的能力。文章通过实例演示了如何使用Equinox和Felix两种OSGi容器,并展示了如何通过创建bundles实现模块间的依赖管理和动态部署。

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

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

目前为止,开放源码的OSGi容器有:
Equinox容器、ApacheFelixKnoflerfish
参考地址:
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中暴露了包含接口sayHellopackage中的
所有接口。其他的三个Bundles都将引入该包。这就是OSGI中的面向服务的通信方式。

 

Felix实现:

Jetty嵌入到Felix中,以支持JSPServlet
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
当然在测试以前,你还必须要有felixjar包,下载地址为:
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
不出意外,嵌入了JettyFelix就会成功启动,可以练习如下命令:

PS
:列出所有的Bundles


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

 

 

 

 

install [jar path] :将指定的jar包安装
uninstall[ID]
:卸载指定的bundle
start [ID] / stop[ID]
:开启/停止 一个
bundle

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

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值