下述部分摘自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时,按下述步骤操作:
- 如果Package导入不冲突,将Fragemnt bundle的包导入定义(Import-Package)附加到Host Bundle的包导入定义中。Fragment可以导入Host bundle的私有包(Private-Package),此时,Host bundle中此包仍保持私有;
- 在Require-Bundle定义不冲突的前提下,将Fragment bundle的Require bundle定义附加到Host bundle的Require bundle定义中;
- 将Fragemnt bundle的Export-Package定义附加到Host bundle的Export-Package定义中。如果Fragment的某个Package的导出定义与Host中导出包的定义完全一致(包名、标记和属性),则此包忽略,否则必须附加。即,可以导出同名包的多个版本。
- 附加Provide-Capability到Host bundle定义;
- 附加Require-Capability到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-description Bundle-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。
相关推荐
NULL 博文链接:https://salever.iteye.com/blog/1474694
osgi发布http服务的各种bundle,各种jar包,全全全~非常好用的技术包 包括:org.eclipse.equinox.http_1.0.0.v20060601a.jar org.eclipse.equinox.ds_1.0.0.v20060601a.jar org.eclipse.equinox.servlet.api_1.0.0...
OSGI bundle 在线用户管理 邮件发送
深入理解OSGi:Equinox原理、应用与最佳实践.pdfOSGi应用开发
blueprint-osgi-bundle
基于 equinox 的 OSGI 运行BUNDLE例子,已包含 ECLIPSE 下的OSGI平台包,按步骤运行即可。 当然,设置JAVA_HOME,及BIN环境变量运行JAVAC 就不用说了 ^-^
深入理解OSGi:Equinox原理、应用与最佳实践,书本源代码
《深入理解OSGi Equinox原理、应用与最佳实践 》完整版。OSGI相关书籍,非扫描版!!!高清文字版!!!
OSGi with CAR-Bundle.ppt
深入理解osgi,本书由浅入深的讲解了osgi的发展历程,模块层规范,生命周期层规范,以及基本实现原理,对初学者和从业人员都有不错的指导意义
osgi多个bundle之间读取同一配置文件,需要单独添加一个用来读取配置文件的bundle
java运行依赖jar包
osgi模块化思想还是蛮值得学习的,热插拔的想法也挺好。
osgi-bundle-hibernate
深入理解OSGi:Equinox原理、应用与最佳实践源代码,同时附带equinox-SDK-3.8源代码。
编译 mvn软件包将在目标中生成捆绑罐 跑步 将捆绑罐复制到OSGI容器,例如Felix或Faraf ...
深入理解Java虚拟机作者周志明又一力作,深入理解OSGi Equinox原理、应用与最佳实践 PDF 完整版
osgi_bundle_ble 此代码使用tinyb获取由eddyston信标广播的数据包,获取以十六进制表示的url,并将其发布到OSGi架构中的事件admin。
DOOR_BLE_OSGI_BUNDLE TinyB和OSGI Java捆绑包
resteasy-osgi-bundle 尝试创建 RESTEasy OSGi 包。 基于此处完成的工作: : 参考: :