下述部分摘自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。
相关推荐
在本文中,我们将深入探讨Spring DM(现在称为Spring OSGi)中的Fragment Bundle以及如何配置Log4j在Fragment Bundle中的应用。Spring DM是Spring框架在OSGi(Open Service Gateway Initiative)环境下的扩展,它...
7. 理解并使用OSGi的安全模型,如声明Bundle的执行权限。 总结来说,OSGi Equinox通过提供一套标准化的模块化、服务化组件机制,为复杂系统的动态化、可维护化提供了强大的支持。掌握其原理和应用,遵循最佳实践,...
OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用...在实际开发中,你还可以探索更多高级特性,如Fragment Bundle、Delegation、Policy等内容,以实现更复杂的模块化系统设计。
Fragment Bundle是一种特殊的bundle,它可以附加到另一个bundle上,以提供额外的类或资源。 **3.12 类空间一致性和“使用”约束** 类空间一致性是OSGi中一个重要的概念,它确保了bundle之间的类加载不会产生冲突。...
4. **Fragment**:特殊类型的bundle,它不能独立存在,必须附着到一个宿主bundle上,以共享其类路径。 5. **felix**和equinox:OSGI的两个主要实现,分别是Apache Felix和Eclipse Equinox,它们提供了丰富的API和...
- **FragmentBundles**: 这类Bundle本身不拥有独立的类加载器,而是在其元数据中指定了`Fragment-Host`字段来表明它所依附的主Bundle。FragmentBundle仅当其宿主Bundle被激活时才会被激活,并且共享宿主Bundle的类...
8. **启动与打包发布**:理解OSGI容器的启动原理,使用特定方法启动和打包bundle,使其可以在目标环境中部署和运行。 在实践中,OSGI的主要优势在于其动态性、模块化和灵活性,但也存在相对复杂的缺点,需要开发者...
在Spring OSGi中,每个服务或组件都被封装成一个独立的Bundle,这些Bundle之间通过OSGi服务注册和查找机制实现依赖注入和通信。开发者需要在Sample中定义 Bundle Activator,它是Bundle启动和停止时执行的入口点,...
标题提到的"osgi-manifest"是一个专门用于解析和理解OSGi bundle中manifest文件的库。这个库对于理解和操作OSGi环境中的bundle至关重要,因为manifest文件包含了描述bundle的关键元数据。 **OSGi Manifest文件** ...
2. **模板支持**:它提供了预定义的模板,用于快速创建不同类型的OSGi工程,如Bundle、Fragment、Composite Bundle等,极大地提高了开发效率。 3. **依赖管理**:插件会智能地处理OSGi bundle间的依赖关系,确保每...
OsgiX:将整个 JRE 暴露给 OSGi 使用扩展包 如果您一直在使用 OSGi,那么您...Fragment-Host: system.bundle; extension:=framework Bundle-SymbolicName: com.diffplug.osgi.extension.sun.misc Bundle-ManifestVer
Bundle是OSGi框架下的术语,它与Eclipse插件相等价,是可部署的代码模块,包含了运行时需要的所有资源。 2. **Extension Point**: 扩展点是插件间交互的接口,定义了其他插件可以插入并添加功能的点。通过扩展点,...