OSGI

2018/01/16 OSGI

OSGI 一

OSGI的简介

OSGI是针对Java对模块化支持不足的情况建立的,OSGI联盟定一个的一个行业标准,座位了对模块化支持的延续,清晰的分离接口和实现。

OSGI是Java平台的一个模块化层。软件应用的代码可以分割为表示独立内容的逻辑单元,如果合理划分逻辑单元,可以强化罗技模块的界限类提高可维护性。如图所示: 图一

OSGI技术已经成为EclipseIDE和GlassFish应用服务器的运行环境。

Java 模块化的不足

Java 通过某些面向对象的方式提供了某种程度的模块化,但是不支持粗粒度的模块化编程。Java已经发展成为构建不同领域的各类应用程序的平台,从移动电话到企业应用。大多数应用都需要更广泛的模块化支持,或者可以从模块化中受益。

  • 低层代码控制的可见性

Java提供了很多控制可见性的访问修饰符号,但这些是为了解决低层面向对象封装,不是为了逻辑系统划分的。Java用包来划分代码,有时应用程序的逻辑结构需要特定的代码分属于不同的包。虽然Java包表面上通过嵌套使其具有逻辑关系,但是其实没有关系,存在嵌套关系的两个包与两个没有嵌套关系的包是相同的,包嵌套主要是为了避免命名冲突,仅仅为逻辑代码划分提供了部分支持。

  • 易错的类路径概念

Java平台会妨碍良好的模块化实践,因为复杂的类路径设置。类路径隐藏了代码版本,依赖和一致性等特性。类路径不关心代码版本,只返回找到的第一个版本。即使关注代码版本还是无法明确描述依赖关系,建立类路径的过程繁琐易错。下图说明了一种“类路径困境”。

图二

即使每个Jar文件已经按照一个工作单元完成编译,但是在执行路径合并时,Java类路径并不关心组件的逻辑划分,这会导致难以预料的错误。例如:一个Jar文件中的类同另一个Jar文件中不兼容的类交互时会出现NoSuchMethodError异常。

独立开发的组件构成的大型应用中,依赖同一组件不同版本的情况并不少见,类路径会强制选择某个可能并不合适的版本。如果类路径中有同一个包的多个版本,都会被Java当作不同的包,并按照出现的顺序隐式融合。

  • 部署和管理支持上的不足

Java 缺少对应用部署和管理的支持,当Java中存在对多个版本的依赖时,没有简单的办法来正确部署这些代码并执行,部署之后更新应用和组件也会面临同样的问题。唯一能实现这个合理需求的方法就是使用类加载器,但是这种方法低级且容易出错,类加载器并不是应用开发者常用的工具,但是现在的许多系统却必须使用它,一个合理定义的Java模块层能够通过明确模块定义和提过代码划分的抽象级别提供对这些特定的支持。

OSGI提供的帮助

OSGI能够提供的一些帮助:

  • OSGI 可以确保代码满足依赖关系然后才运行执行代码
  • OSGI 会在要求的版本和其它约束条件方面对依赖集进行一致性检查
  • OSGI 能够解决层次化的类加载模式隐含的限制
  • OSGI 可以将程序打包成逻辑上独立的JAR文件,并且只部署某个安装所需要的部分。
  • OSGI 可以将程序打包为逻辑上独立的JAR,并且声明那些代码可以被其它JAR文件访问,并且强调可见性。
  • OSGI 为程序定义了一个插件式的拓展机制,包括运行时动态拓展。
Show Disqus Comments

Search

    Table of Contents