首页 > 代码库 > OSGI实战第一章

OSGI实战第一章

第一章         解开OSGI的面纱

  1. OSGI是什么?是Java平台的一个模块化层。
  2. 模块化:软件应用程序的代码被分割为表示独立内容的逻辑单元,可简化开发,可通过强化逻辑模块的界限来提高可维护性。
  3. Java模块化的不足

a)         Java使用访问修饰符(如public、protected、private和包级私有),解决底层面向对象封装,而不是逻辑系统划分。

比如,如果需要代码在多个包之间课件,那么包内的代码必须声明为public,那么所有的模块都可以使用这个public类。这样会暴露具体的实现细节,用户可能依赖于不想要公开的API,使后续的升级更加困难。

b)         易错的类路径概念、

原因是类路径隐藏了代码版本、依赖和一致性等特性。类路径不关系代码版本,无法明确描述依赖关系。建立类路径的过程是烦琐易错的,你只是不停地添加类库,知道虚拟机不再报找不到类的错误。经常出现一个JAR文件的类与另一个JAR文件中不兼容的类交互时会出现NoSuchMethodError异常。

c)         部署和管理支持上的不足。

在Java中存在对多个版本的依赖时,没有简单的方法来正确部署这些代码并执行。在部署之后更新应用和组件也会面临同样问题。

  1. OSGI的帮助

a)         当启动程序时,先确保代码满足依赖关系,然后才允许执行代码。不会出现由于类路径不正确导致ClassNotFoundException或NoSuchMethodError。

b)         要求在版本和其他约束条件方面上对依赖集进行一致性检查,不会出现由于依赖库的错误版本导致程序执行时错误。

c)         不必担心由于层次化的类加载模式隐含的限制,导致没款见共享类时导致类型不一致,如foo instanceof Foo == false。

d)        将一个程序打包成逻辑上独立的JAR文件,并且只部署哪些某个安装需要的部分。这大致阐述了OSGi的目的。

e)         OSGi为JAR文件定义了新一级的代码可见性。将一个程序打包成逻辑上独立的JAR文件,声明哪些代码是可以被其他JAR文件访问。

f)          为程序定义一个插件式的扩展机制。OSGi模块化特别适合提供强大的扩展性机制,包括支持执行时的动态性。

  1. 架构概览

OSGi服务平台包括OSGi框架和OSGi标准服务。

l  OSGI框架是实现并提供OSGi功能的运行环境。

l  OSGi标准服务定义了很多用于执行常见任务(如日志和首选项)的可重用API。

  1. OSGi框架

a)         框架的实现方式:Apache Felix, Eclipse Equinox,KnopFlerfish。Eqinox OSGi框架实现是Eclipse IDE的底层运行时环境。Apache Felix OSGi框架实现是GlassFish v3的运行环境。多种应用长江表明OSGi框架具有很高的价值和灵活性。

b)         OSGi框架的分层结构:

                         i.              模块层,关注于打包和共享代码。

                       ii.              生命周期层,关注于提供执行时环境模块管理和对底层OSGi框架的访问。

                      iii.              服务层,关注于模块,特别是模块内的组件间的交互和通信。

  1. 模块层

l  定义了OSGI模块的概念,并称为bundle。

l  Bundle是一个包含元数据、类文件和相关资源的JAR文件。

l  Bundle可以是一个普通的JAR文件+特殊的元数据,也可以是包含构成一个特定应用程序的多个逻辑模块组成的JAR。

l  Bundle比标准的JAR文件更强大,因为可以明确声明名导出包。从这个意义上说,Bundle扩展了Java的普通访问修饰符(public,private,protected)。

l  Bundle可以明确声明依赖哪些外部包(导入)。

l  明确声明导入包和导出包的好处是:OSGI框架可以自动地管理和验证它们的一致性,称为bundle解析,使导入包和导出包相匹配,确保bundle版本和其他方面约束的一致性。

  1. 生命周期层

l  定义了在OSGI框架中是如何动态安装和管理Bundle的。

l  目的一:在应用程序外部,精确定义啦bundle生命周期的操作(安装、更新、启动、停止和卸载)。

l  目的二:定义了bundle如何访问它们的执行环境。如何访问它们的执行环境。执行环境为bundle提供了一种与OSGi框架交互的方式和执行时的一些便利。

l  生命周期层整体支持创建可从外部(和远程)管理的而应用程序,或者完全自我管理的应用程序,或者两者的任意组合。

  1. 服务层

l  使用基于接口的面向服务的交互模式。

l  主要涉及面向服务的发布、查找和绑定。服务提供者将服务发布到服务注册中心;服务客户端通过搜索服务注册中心,查找可供使用的服务。

l  基于接口,提倡接口与实现之间的分离。OSGI服务是Java接口,表示服务提供者和服务客户端之间的一种契约。服务层通过基于服务的动态性(服务可以在任何时刻出现或消失)来扩展声明周期层基于bundle的动态性。结果产生了一种支持模块化和灵活性的编程模式。

  1. 如何使用OSGi框架中的层?

a)         涉及应用,将它分解为一些服务接口(普通的基于接口和编程)和这些接口的客户端。

b)         使用你选定的工具和方法来实现服务提供者和客户端组件。

c)         将服务提供者和客户端组件打包成独立的JAR文件,然后用合适的OSGi元数据扩展每个JAR文件。

d)         启动OSGi框架

e)         安装和启动所有来自步骤c的JAR文件。

OSGI实战第一章