什么是 OSGi
开放式服务网关工作小组
Open Service Gateway Initiative
Java动态模块
Enabled greater dynamic modularity in Java
为我们带来的帮助
- 建立面向服务(SOA in VM)模块化的 Java 应用
- 帮助我们分离接口和实现
- 更好的使用基于接口的开发模式,创建模块和管理应用
- 将要软件要处理的每个具体问题放入分离的逻辑单元
- 每个逻辑单元具有自已的逻辑边界
- 逻辑单元保持简单和可维护性(Unix Slang: do one thing well!)
我们以前的几个主要问题
Java 模块化是建立在面向对象的类文件上
- 并不支持更粗粒度的模块化
- 其代码级是访问修饰符在于完成很细粒度的面向对象封装,而不是逻辑单元
Java 通过包( package ) 划分代码单元
- 进行跨包访问Java的类需要将被访问类申明为 public (或protected, 如果是通过类继承的方式)
- 这样会暴露实现细节破坏封装,会让客户端程序员误用我们的非公共 API
Java VM 通过 Class Path 加载类
- 缺少代码的版本,类依赖,和一致性的约束 (Returns the first version it finds)
- 我们无法部署指定版本的依赖和无法演进已部署的组件
OSGi 帮助我们解决了
- 通过依赖检查,避免在运行期出现 ClassNotFoundException
- 通过指定版本的依赖,避免在运行期出现错误的类依赖
- 避免出现由于层次类装载体系出现的 bar instanceof Bar == false
- 分逻辑单元打包部署 Jar 文件
- 对包申明访问控制,更好的隐藏实现保护封装
- 为应用提供强大扩展机制,包括运行期扩展
后续导读
OSGi 理论: 分层
OSGi 理论: 模块元数据 (Bundle's manifest file)
OSGi 实践: 包装 OSGi bundle