# osgi-samples **Repository Path**: LamTong/osgi-samples ## Basic Information - **Project Name**: osgi-samples - **Description**: OSGI 框架(Equinox) 示例程序 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-08-28 - **Last Updated**: 2023-11-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OSGI-Samples > `osgi-samples` 是基于 OSGI 框架(即 Equinox) 的示例程序. --- # OSGI 简介 `OSGI(开放服务网关协议, Open Service Gateway Initiative)` 技术是 Java 动态化模块化系统的一些列规范. OSGI 一方面指的是维护 OSGI 规范的 OSGI 官方联盟, 另一方面指的是该组织维护的基于 Java 语言的服务规范. 简单来说, OSGI 可以认为是 Java 平台的模块层. OSGI 服务平台由 Java 提供服务, 这些服务是 Java 成为软件集成和软件开发的首选环境. OSGI 规范和核心部分是一个框架, 其中定义了应用程序的生命周期模式和服务注册. 基于这个框架定义了大量的 OSGI 服务: 日志、配置管理、偏好、HTTP、XML分析、设备访问、软件包管理、许可管理、用户管理、IO 连接、连线管理等. 这个框架实现了一个优雅、完整和动态的组件模型. 应用程序无需重新引导可以被远程安装、启动、升级和卸载(其中 Java 包/类的管理被详细已定义). API 中还定义了运行远程下载管理策略的生命周期管理. 服务注册允许 bundles 取检测新服务和取消的服务, 然后相应配合. OSGI 框架一般具备的基础功能: * 支持模块化的动态部署: 基于 OSGI 而构建的系统能够以模块化的方式动态地部署到框架中, 从而增加、扩展或改变系统的功能. 支持模块化的封装和交互. 每个工程(模块)可通过声明 Export-Package 对外提供访问此工程的类和接口. * 支持模块的动态扩展: 基于 OSGI 提供的面向服务的组件模型的设计方法, 以及 OSGI 实现框架提供的扩展点方法可实现模块的动态扩展. 模块化的设计, 在 OSGI 模块由一个或多个 bundles 构成, 模块之间的交互通过 Import-Packages、Export-Packages 以及 OSGI Service 的方式实现. * 动态化的设计: 指的是系统中所有的模块必须支持动态的插拔和修改. * 可扩展的设计: 通常使用定义扩展点的方式. 按照 Eclipse 推荐的扩展点插件和标准格式定义 bundles 中的扩展点, 其他要扩展的 bundles 可通过实现相应的扩展点来扩展该 bundles 的功能. 每个 bundles 拥有独立的 classloader, 通过它来完成本 bundles 类的加载. * 稳定、高效的系统: 基于 OSGI 的系统采用的微核机制, 微核机制保证了系统的稳定性, 微核机制的系统只要微核是稳定运行的, 那么系统就不会崩溃, 也就是说基于 OSGI 的系统不会手动运行在其中的 bundle 的影响, 不会因为 bundle 的崩溃而导致整个系统的崩溃. 为了最小化耦合和促使这些耦合度可管理, OSGI 技术提供一种面向服务的架构, 它能使这些组件动态地发现对方. OSGI 的职责就是为了让开发者能够创建动态化、模块化的 Java 系统. OSGI 框架从概念上可以分为三层: 模块层、生命周期层和服务层. * 模块层: 模块层主要涉及包及共享的代码 * 生命周期层: 生命周期层主要涉及 Bundle 的运行时生命周期管理 * 服务层: 服务层主要涉及模块之间的交互和通信 模块层是 OSGI 框架的最基础的部分.OSGI 的模块化, 是通过为 Jar 包添加 metadata 来定义哪些类该暴露, 哪些类该隐藏, 其控制单元叫做 Bundle. 什么是 Bundle? Bundle 是以 Jar 包形式存在的一种模块化单元, 里面包含了代码、资源文件和元数据, 并且 Jar 包的物理边界也同时是运行时逻辑模块的封装边界. 如何定义 Bundle? Bundle 是 OSGI 的基本组件, 其表现形式仍然为 Java 概念中传统的 Jar 包. 通过 META-INF 目录下的 MANIFEST.MF 文件对其予以进一步的定义. 通常一个 MANIFEST.MF 文件的内容如下: ``` Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Util Bundle-SymbolicName: com.ibm.director.la.util Bundle-Version: 1.0.0 Bundle-RequiredExecutionEnvironment: J2SE-1.5 Import-Package: org.osgi.framework;version="1.3.0" Export-Package: com.ibm.director.la.util;uses:="org.osgi.framework" Bundle-ClassPath: lib/junit.jar, ``` MANIFEST.MF 文件存储的实际上是 Bundle 的元数据. 元数据的内容可以精确地定义 Bundle 的各种特征, 同时能更好地对 Bundle 进行标识同时帮助用户对 Bundle 进行理解. 生命周期层是 OSGI 框架中属于模块层上面的一层, 它的运作是建立在模块层的功能之上. 生命周期层的主要功能是控制动态安装、开启、关闭、更新和卸载 Bundle. 生命周期层让您能够从外部管理应用或建立能够自我管理的应用(或二者的结合), 并且给了应用本身很大的动态性. 在标准的 Java 编程中, 可以通过将 Jar 包放到 classpath 中来使用它. 而 Bundle 则不是这样, Bundle只有在被安装(install)到一个 OSGI 框架的运行实例中才能用起来. 并且 OSGI 框架支持对这些 Bundle 完整的生命周期管理, 并且支持这些管理操作在应用执行完成. 一个 OSGI 服务就是注册到 OSGI 框架的一个 Java 对象, 注册的时候可以设置这个 Service 的属性. 而在获取 Service 的时候可以根据属性进行过滤. Bundle 可以通过 Bundle 的上下文去注册 Service 或查询 Service. 一个提供服务的 Bundle 可以发布 POJO 作为服务的实体; 一个使用服务的 Bundle 可以通过这个注册表找到和绑定服务. [操作步骤](osgi-samples.md) ---