第一章 解开OSGI的面纱
- OSGI是什么?是Java平台的一个模块化层。
- 模块化:软件应用程序的代码被分割为表示独立内容的逻辑单元,可简化开发,可通过强化逻辑模块的界限来提高可维护性。
- Java模块化的不足
a) Java使用访问修饰符(如public、protected、private和包级私有),解决底层面向对象封装,而不是逻辑系统划分。
比如,如果需要代码在多个包之间课件,那么包内的代码必须声明为public,那么所有的模块都可以使用这个public类。这样会暴露具体的实现细节,用户可能依赖于不想要公开的API,使后续的升级更加困难。
b) 易错的类路径概念、
原因是类路径隐藏了代码版本、依赖和一致性等特性。类路径不关系代码版本,无法明确描述依赖关系。建立类路径的过程是烦琐易错的,你只是不停地添加类库,知道虚拟机不再报找不到类的错误。经常出现一个JAR文件的类与另一个JAR文件中不兼容的类交互时会出现NoSuchMethodError异常。
c) 部署和管理支持上的不足。
在Java中存在对多个版本的依赖时,没有简单的方法来正确部署这些代码并执行。在部署之后更新应用和组件也会面临同样问题。
- OSGI的帮助
a) 当启动程序时,先确保代码满足依赖关系,然后才允许执行代码。不会出现由于类路径不正确导致ClassNotFoundException或NoSuchMethodError。
b) 要求在版本和其他约束条件方面上对依赖集进行一致性检查,不会出现由于依赖库的错误版本导致程序执行时错误。
c) 不必担心由于层次化的类加载模式隐含的限制,导致没款见共享类时导致类型不一致,如foo instanceof Foo == false。
d) 将一个程序打包成逻辑上独立的JAR文件,并且只部署哪些某个安装需要的部分。这大致阐述了OSGi的目的。
e) OSGi为JAR文件定义了新一级的代码可见性。将一个程序打包成逻辑上独立的JAR文件,声明哪些代码是可以被其他JAR文件访问。
f) 为程序定义一个插件式的扩展机制。OSGi模块化特别适合提供强大的扩展性机制,包括支持执行时的动态性。
- 架构概览
OSGi服务平台包括OSGi框架和OSGi标准服务。
l OSGI框架是实现并提供OSGi功能的运行环境。
l OSGi标准服务定义了很多用于执行常见任务(如日志和首选项)的可重用API。
- OSGi框架
a) 框架的实现方式:Apache Felix, Eclipse Equinox,KnopFlerfish。Eqinox OSGi框架实现是Eclipse IDE的底层运行时环境。Apache Felix OSGi框架实现是GlassFish v3的运行环境。多种应用长江表明OSGi框架具有很高的价值和灵活性。
b) OSGi框架的分层结构:
i. 模块层,关注于打包和共享代码。
ii. 生命周期层,关注于提供执行时环境模块管理和对底层OSGi框架的访问。
iii. 服务层,关注于模块,特别是模块内的组件间的交互和通信。
- 模块层
l 定义了OSGI模块的概念,并称为bundle。
l Bundle是一个包含元数据、类文件和相关资源的JAR文件。
l Bundle可以是一个普通的JAR文件+特殊的元数据,也可以是包含构成一个特定应用程序的多个逻辑模块组成的JAR。
l Bundle比标准的JAR文件更强大,因为可以明确声明名导出包。从这个意义上说,Bundle扩展了Java的普通访问修饰符(public,private,protected)。
l Bundle可以明确声明依赖哪些外部包(导入)。
l 明确声明导入包和导出包的好处是:OSGI框架可以自动地管理和验证它们的一致性,称为bundle解析,使导入包和导出包相匹配,确保bundle版本和其他方面约束的一致性。
- 生命周期层
l 定义了在OSGI框架中是如何动态安装和管理Bundle的。
l 目的一:在应用程序外部,精确定义啦bundle生命周期的操作(安装、更新、启动、停止和卸载)。
l 目的二:定义了bundle如何访问它们的执行环境。如何访问它们的执行环境。执行环境为bundle提供了一种与OSGi框架交互的方式和执行时的一些便利。
l 生命周期层整体支持创建可从外部(和远程)管理的而应用程序,或者完全自我管理的应用程序,或者两者的任意组合。
- 服务层
l 使用基于接口的面向服务的交互模式。
l 主要涉及面向服务的发布、查找和绑定。服务提供者将服务发布到服务注册中心;服务客户端通过搜索服务注册中心,查找可供使用的服务。
l 基于接口,提倡接口与实现之间的分离。OSGI服务是Java接口,表示服务提供者和服务客户端之间的一种契约。服务层通过基于服务的动态性(服务可以在任何时刻出现或消失)来扩展声明周期层基于bundle的动态性。结果产生了一种支持模块化和灵活性的编程模式。
- 如何使用OSGi框架中的层?
a) 涉及应用,将它分解为一些服务接口(普通的基于接口和编程)和这些接口的客户端。
b) 使用你选定的工具和方法来实现服务提供者和客户端组件。
c) 将服务提供者和客户端组件打包成独立的JAR文件,然后用合适的OSGi元数据扩展每个JAR文件。
d) 启动OSGi框架
e) 安装和启动所有来自步骤c的JAR文件。