理解OSGi的Fragment Bundle
? ? ? ?下述部分摘自OSGi Core规范中关于Fragment bundle的规范描述,翻译一下,加深印象。
? ? ? ? Fragment Bundle是一个可追加于一个或多个主体(Host)Bundle的Bundle。Fragment Bundle与其Host Bundle之间是从主关系,并且Fragment Bundle不能独立运行,它在Host Bundle解析之前被框架追加到Host Bundle,随之被看作是Host Bundle的一部分。 Fragment Bundle具有自己的保护域,但没有自己的Class loader。
? ? ? ? 具有相同的Symbolic Name且版本不同的Fragment bundle 可以追加到多个Host bundle。如果存在多个具有相同Fragment bundle应用的一个主要场景是用来提供不同语言的翻译包,在这种模式下,每种语言包可以作为独立的Fragment bundle存在。
? ? ? ? 当一个已追加的fragment更新时,之前追加到Host bundle的内容会继续保留。新的fragment内容只有在框架重启或者Host bundle刷新时才会追加到Host。在这种情况下,fragment具有两个版本:已追加的版本;可以追加到新的Host或其它host bundle的新的fragment bundle。
? ? 当框架追加一个fragment bundle到一个host bundle时,按下述步骤操作:
?
? ? 如果Host和Fragment不能提供一致的类空间,则会产生冲突。如果存在冲突,Fragment bundle则不能追加到Host。
? ? 当且仅当一个Fragment bundle成功追加到至少一个Host bundle时,此Fragment bundle进入Resolved状态。
? ? 在运行时,fragment的jar在类路径查找中位于host bundle的类路径查找之后。
? ? Fragment bundle不能出现在其他bundle的Require-Bundle定义中。
?
? ? Fragment-Host清单头的语法定义:
?
Fragment-Host ::= bundle-descriptionBundle-description ::= symbolic-name(';'parameter)*
?
?
Fragment-Host可配置的标记属性:
Extension(
仅在Fragment-Host是系统bundle(id=0)时允许此标记
)
framework/bootclasspath
framework:fragment bundle是框架的扩展bundle
bootclasspath:fragment bundle是启动类路径的扩展bundle
Bundle-version
[0.0.0,∞)
如果属性值是一个范围,则fragment bundle将追加到所有符合条件的host
?
? ? 逻辑上,从fragment bundle追加到host bundle开始,fragment bundle就是host bundle的一部分,fragment bundle中的所有类及资源都由host bundle的类加载器加载。
? ? Host自身的类查找路径在其所有的fragment bundle类路径之前;fragment bundle的类查找路径顺序按照fragment bundle ID的升序排列。
?
? ? ? ? Fragment bundle的另一个常见用途是扩大现有bundle的类加载范围,比如commons-dbcp bundle需要加载各种数据库的jdbc驱动,可以将这些驱动封装为commons-dbcp的fragment bundle。如果已有的jdbc驱动需要独立bundle存在,则可以封装一个该驱动的wrpper fragment bundle。