暑假大作业为期两个月,从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文件的完整内容:
从Fragment-Host的值可以看出,它attach的是6.0.18版本的catalina。
下面是项目工程结构:
有错是因为Framework没有找到com.springsource.org.apache.catalina这个Host Bundle,此时需要下载相应版本的Bundle,并放在plugins文件夹下面(plugins文件夹的位置因不同版本的eclipse与myeclipse而有所不同),然后重启eclipse或者myeclipse,这里用到的Framework为Equinox。
到这里为止,就是一个简单的Fragment Bundle。
疏漏错误之处,在所难免,恳请高手们指正。
Best Regards
胡靖飞