OSGI:
OSGI的体系架构是基于插件式的软件结构,包括一个 OSGI 框架和一系列插件,在 OSGI中,插件称为 Bundle,其中,OSGI框架规范是OSGI规范的核心部分,它提供了一个通用的、安全可管理的 Java 框架,通过这个框架,可以支持 Bundle 服务应用的部署和扩展。Bundle 之间可以通过 Import Package 和 Require-Bundle 来共享 Java 类,在 OSGi 服务平台中,用户通过开发 Bundle 来提供需要的功能,这些 Bundle 可以动态加载和卸载,或者根据需要远程下载和升级
OSGI 架构图:
Execution Environment:
Bundle 应用所倚赖运行的 Java 执行环境,如 J2SE-1.4、CDC-1.0 等都是可用的执行环境。
Modules:
模块层定义了 Bundle 应用的加载策略。OSGi 框架是一个健壮并且严格定义的类加载模型。在大多数 Java 应用中,通常只有一个单独的 ClassPath,它包含了所有的 Java 类文件和资源文件,OSGi基于Java技术,对于每个实现了 BundleActivator 接口的 Bundle 应用,为它生成一个单独的 ClassLoader,使得 Bundle 应用的组织更加模块化。
Life Cycle:
生命周期层可以动态地对 Bundle 进行安装、启动、停止、升级和卸载等操作。该层基于模块层,提供了一组 API 来控制 Bundle 应用的运行时操作。
Service Registry 和 Services:
OSGi 服务层定义了一个集成在生命周期层中的动态协作模型,是一个发布、动态寻找、绑定的服务模型。一个服务通常是一个 Java 对象实现了特定的服务接口,并且通过服务注册,被绑定到 OSGi 的运行环境中。Bundle 应用可以注册发布服务,动态绑定服务,并且在服务注册状态改变时,可以接受到事件消息等。
Security:
OSGi 的安全管理是基于 Java2 安全体系的,贯穿在 OSGi 平台的所有层中,它能够对部署在 OSGi 运行环境中的 Bundle 应用进行详细的管理控制。
Bundle的组成:
1、MANIFEST.MF:描述了 bundle 的所有特征,包括名字、输出的类或者包,导入的类或者包,版本号等等。
2、代码:包括 Activator 类和其它一些接口以及实现,这个和普通的 Java 应用程序没有什么特殊的区别
3、资源:当然,一个应用程序不可能没有资源文件,比如图片、properties 文件、XML 文件等等,这些资源可以随 bundle 一起存在,也可以以 fragment bundle 的方式加入
OSGI中的Bundle:
Bundle可以通过export的方式向OSGI容器中的其他Bundle公开自己Bundle中的包,包含模型,接口类等。
也可以通过import方式将OSGI容器中其他Bundle导出的包进行引入。
Bundle也可以定义扩展点,也可以实现其他Bundle公布的扩展点。
MANIFEST.MF
manifest.mf是用于描述Bundle信息的文件,通常位于/META-INF/目录下
属性名字 | 含义 |
Bundle-Activator |
Bundle 的启动器 |
Bundle-SymbolicName |
名称,一般使用类似于 JAVA 包路径的名字命名 |
Bundle-Version |
版本,注意不同版本的同名 bundle 可以同时上线部署 |
Export-Package |
导出的 package 声明,其它的 bundle 可以直接引用 |
Import-Package |
导入的 package |
Eclipse-LazyStart |
是否只有当被引用了才启动 |
Require-Bundle |
全依赖的 bundle,不推荐 |
Bundle-ClassPath |
本 bundle 的 class path,可以包含其它一些资源路径 |
Bundle-RequiredExecutionEnvironment |
本 bundle 必须的执行环境,例如 jdk 版本声明 |
Bundle生命周期管理:
Bundle的状态变迁图:
状态含义:
状态名字 | 含义 |
INSTALLED |
就是字面意思,表示这个 bundle 已经被成功的安装了 |
RESOLVED |
很常见的一个状态,表示这个 bundle 已经成功的被解析(即所有依赖的类、资源都找到了),通常出现在启动前或者停止后 |
STARTING |
字面意思,正在启动,但是还没有返回,所以您的 Activator 不要搞的太复杂 |
ACTIVE |
活动的,这是我们最希望看到的状态,通常表示这个 bundle 已经启动成功,但是不意味着您的 bundle 提供的服务也是 OK 的 |
STOPPING |
字面意思,正在停止,还没有返回 |
UNINSTALLED |
卸载了,状态不能再发生变更了 |
Bundle的运行以来OSGI平台为其提供的Classloader,由classloader负责查找装载该Bundle运行所依赖(Require-Bundle )和导入(Import-Packag)的包以及该Bundle本身。
Bundle的ClassLoader
Bundle的Classloader能加载的所有类的集合构成了Bundle的类空间(Class Space)。该类弓箭包含的类资源主要有以下方面:
1、父ClassLoader可加载的类集合
2、Import-Package定义的导入的包
3、Require-Bundle定义的依赖的Bundle的类集合;
4、Bundle自身的类集合,通常在Bundle-Classpath中定义
5、属于该Bundle的Fragment类集合。
在实际运行环境中,Bundle 的 Class Loader 根据如下规则去搜索类资源。规则简要介绍如下:
1、如类资源属于 java.* 包,则将加载请求委托给父加载器(所有Bundle都有共同的Parent ClassLoader)
2、如类资源定义在OSGI框架的启动委托列表(org.osgi.framework.bootdelegation)中,则将加载请求委托给父加载器
3、如类资源属于在 Import-Package 中定义的包,则框架通过 Class Loader 依赖关系图找到导出此包的 Bundle 的 Class Loader,并将加载请求委托给此 Class Loader ;
4、如类资源属于在 Require-Bundle 中定义的 Bundle,则框架通过 Class Loader 依赖关系图找到此 Bundle 的 Class Loader,将加载请求委托给此 Class Loader ;
5、Bundle 搜索自己的类资源 ( 包括 Bundle-Classpath 里面定义的类路径和属于 Bundle 的 Fragment 的类资源);
6、若类在 DynamicImport-Package 中定义,则开始尝试在运行环境中寻找符合条件的 Bundle 。
如果在经过上面一系列步骤后,仍然没有正确地加载到类资源,则 OSGi 框架会向外抛出类未 发现异常
参考:
探索OSGI框架的组件运行机制:http://www.ibm.com/developerworks/cn/java/j-lo-osgi/
使用Equniox开发OSGI应用程序:http://www.ibm.com/developerworks/cn/education/opensource/os-eclipse-osgi/index.html
相关推荐
开发者在使用Spring OSGi时,需要了解如何编写OSGi兼容的jar包,以及如何在Spring配置文件中声明和管理OSGi服务。此外,调试和测试OSGi环境下的应用程序也是一项挑战,因为它们涉及到复杂的生命周期管理和依赖关系...
OSGi的核心是其服务导向的架构,它允许开发者将应用程序分解为独立的模块,这些模块称为"bundles"或"服务"。每个bundle都包含代码和元数据,描述了它提供的服务以及它依赖的服务。这种模块化的方法使得在运行时动态...
- 提供的示例程序可能包含了如何创建和配置Spring OSGi bundle,以及如何在OSGi容器中运行和交互的示例代码。 - 通过学习这些示例,开发者可以快速掌握Spring OSGi的基本用法和最佳实践。 8. **Spring OSGi的应用...
在Atlassian-plugins-osgi-2.6.0.jar中,我们可以看到它包含了对Atlassian插件系统的OSGi实现,以及相关的依赖项。这些依赖项可能是Atlassian平台的基础组件,也可能是第三方库,它们共同构成了一个完整的运行环境。...
值得注意的是,随着Java EE和微服务架构的发展,OSGi和Spring的组合在现代应用中可能不是首选,但它们对于理解模块化和动态服务管理的概念仍然具有重要的教学价值。 最后,`osgi-tutorial`这个压缩包可能包含了逐步...
在Spring OSGi中,Spring的应用组件可以作为OSGi服务来发布和消费,从而实现更灵活、可插拔的架构。 标题"spring-osgi-1.2.0.zip"表明这是一个包含Spring OSGi 1.2.0版本的压缩包。这个版本可能包含了Spring框架与...
将服务接口和服务实现打包成一个OSGi bundle,并在bundle中声明服务组件。 4. **配置服务**:配置服务的元数据,如服务接口、服务实现、以及任何依赖的服务。这可以通过XML配置文件或注解来完成。 5. **消费服务**...
在“org.eclipse.osgi-3.7.2”中,主要包含实现OSGi运行时环境所需的类库和服务,如启动、管理bundle的生命周期、处理bundle间的依赖关系等。 在Eclipse OSGi框架下,每个bundle都有自己的类加载器,这使得bundle...
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框架是实现OSGi规范的软件,负责管理Bundle的生命周期,处理模块间的依赖关系,以及服务的注册和查找。例如,Eclipse Equinox和Apache Felix是常见的OSGi框架。 5. 使用《OSGi实战》学习: 书中涵盖了从基础...
书中可能涵盖了如bundle的设计原则,如何优化服务注册,如何处理依赖注入,以及如何调试和测试OSGI应用等内容。这些实践指导有助于开发者避免常见陷阱,提升开发效率,构建更加稳定、可维护的系统。 通过学习这些...
OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为独立的模块,称为“bundle”。每个bundle都有自己的类加载器,可以动态地安装、启动、更新和卸载,使得应用程序的管理...
4. **生命周期管理**:Eclipse OSGi提供了对bundle的完整生命周期管理,包括启动、停止、更新和卸载等操作。开发者可以通过控制这些操作来响应系统变化。 5. **动态依赖解析**:OSGi框架会自动处理bundle之间的依赖...
8. **Eclipse OSGi 的应用**:Eclipse IDE 使用 OSGi 作为其核心架构,每个插件都可以视为一个 OSGi bundle。此外,OSGi 也被用于服务器端应用,如 Apache Karaf 或 GlassFish,以及嵌入式系统和物联网设备。 9. **...
Felix作为OSGi容器,可以用来运行和管理Bundle。 开发环境准备的具体步骤包括: 1. 下载并安装JDK,并设置好环境变量JAVA_HOME、CLASSPATH和PATH,以确保编译和运行Java程序。 2. 获取并安装Maven,同样需要设置...
OSGI(Open Service Gateway Initiative)是一种模块化系统和服务平台,它允许软件以模块化的方式进行构建、部署和管理。OSGI在Java世界中扮演着重要的角色,因为它提供了动态性、可扩展性和灵活性,使得开发者能够...
Eclipse OSGi是Eclipse项目对OSGi规范的具体实现,它为Eclipse IDE以及其他基于Eclipse的应用提供了基础架构。 描述中的信息虽然简洁,但我们可以理解这是指定了OSGi组件的特定版本,即3.8.1。版本号"20120830-...
OSGi(Open Services Gateway Initiative)是一种开放标准的Java模块化系统,它允许开发人员将应用程序分解为一组可独立更新和管理的小型服务组件。在"OSGi -- Helloworld 学习记录一"这篇博文中,作者很可能是分享...
3. **OSGi Bundle**:在OSGi框架中,一个Bundle相当于Java世界中的JAR文件,但它们包含了额外的元数据,使得它们能够在OSGi环境中被管理和控制,例如启动、停止、更新和依赖管理。 4. **测试支付模块**:在KillBill...
OSGi R4的核心功能主要围绕模块化架构、生命周期管理、服务注册与发现等方面展开,下面将详细介绍这些方面及其相关的API。 ##### 1. 模块化架构 - **Bundle**: 在OSGi中,每个模块被称为一个“bundle”,它是OSGi的...