Learning--初识Fragment Bundles

暑假大作业为期两个月,从07月01日到08月30日,选择在淘宝公司实习。大作业中,鉴于项目技术与业务上的双重要求,需要动态地增加、更新和删除某些负责专门业务的服务,从而学习OSGi,并应用到项目当中。

OSGi,本质上是一个规范,目前最新的版本为OSGi Service Platform Release 4 Version 4.1,依据这个规范,软件开发商们开发出来的服务,便可以应用在家庭、汽车、移动电话、笔记本、小型办公室等等各种环境中,只要是符合OSGi规范,这个服务就不会因为环境的不同而丧失了应用价值,它依旧可以正常工作。

而在项目中,需要将tomcat转变成一个bundle,而tomcat最重要的两个配置文件,web.xml与server.xml,会因为应用的不同而内容可能有所差异,故而将这两个配置文件分别放到一个Fragment Bundle中,如果新应用的配置文件不同,就可以利用新应用的配置文件新建一个Fragment Bundle,而不用去修改Host Bundle。

Fragment Bundle是相对于Host Bundle来说的,Fragment Bundle里面的任何定义都会被Framework附加到Host Bundle的定义里面去,它们不会有自己的class loader,Fragment Bundle里面的任何类与资源都将被Host Bundle的class loader load进来,Fragment Bundle只是Host Bundle的一部分。最能说明Fragment Bundle的用途的是语言包,不同的语言包是作为主程序Bundle的Fragment而相互独立存在的。

当一个Fragment Bundle的内容更新时,需要更新Host Bundle或者重启Framework,才能看到变化。Fragment Bundle和Host Bundle之间,不能存在import definitions、Request-Bundle entry以及export definitions之间的冲突,倘若发生冲突,前两者的情况是该Fragment Bundle失效,后两者的情况是该Fragment Bundle的export definitions将会被忽略,但仍旧是attach在Host Bundle上的,此时并没有失效。

现在来看一下作为一个Fragment Bundle,在MANIFEST文件上有什么要求:

Fragment-Host           ::=  bundle-description

bundle-description      ::=  symbolic-name(‘;’parameters)*

上面这种表述方式采用编译器中表示文法的类似方式。其中,Fragment-Host可接受的属性为bundle-version,默认值为[0.0.0,∞),当attach一个Fragment Bundle时,总是选择最高版本的Fragment Bundle。当有多个Fragment Bundle需要load时,按照Bundle ID的升序来load,一旦某个Fragment在load时出现错误,那么该Fragment Bundle就不会attach to the Host Bundle,当成功load时,它的状态就为RESOLVED。注意当指定了Fragment-Host值时,就不应该再指定Bundle-Activator的值。

当Host Bundle is unresolved时,它所有的Fragment Bundle都将被unattach,当其中某个Fragment Bundle is unresolved时,Framework会做三件事,第一,将该Fragment Bundle从Host Bundle里面unattach,第二,re-resolve Host Bundle,第三,reattach其余的Fragment Bundle。当调用Fragment Bundle或者它的Host Bundle的refreshPackages或者resolveBundle方法,将会导致该Fragment Bundle处于不是RESOLVED的状态。

下面是一个仅含有web.xml的Fragment Bundle的MANIFEST.MF文件的完整内容:

image

从Fragment-Host的值可以看出,它attach的是6.0.18版本的catalina。

下面是项目工程结构:

image

有错是因为Framework没有找到com.springsource.org.apache.catalina这个Host Bundle,此时需要下载相应版本的Bundle,并放在plugins文件夹下面(plugins文件夹的位置因不同版本的eclipse与myeclipse而有所不同),然后重启eclipse或者myeclipse,这里用到的Framework为Equinox。

到这里为止,就是一个简单的Fragment Bundle。

疏漏错误之处,在所难免,恳请高手们指正。

Best Regards

胡靖飞

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值