1. 什么是OSGi?
OSGi的名称来源于其开源组织的名称Open Services Gateway initiative,OSGi是一个标准,它致力于提供给Java项目一个模块化的底层环境,以及一系列通用的服务(Service)。和普通的JVM程序相比,OSGi的程序天生拥有动态模块的特点,不同的模块(OSGi里称之为Bundle)有着独立的生命周期,可以独立进行安装、启动、停止、卸载的操作,模块间的依赖性管理也由OSGi提供。你可以看出,OSGi非常适合需要进行Plugin管理的项目,一个典型的成功案例就是Eclipse和它众多的Plugin。OSGi标准还规范了一系列我们常间的操作,日志、配置文件、事件队列、Web开发、JPA&JDBC等等,大部分部署OSGi标准的框架都提供了这些服务,这样一方面规范了我们代码的结构,一方面节约了我们开发的时间。
目前基于OSGi的框架大概有4个:Knopflerfish, Apache Felix, Equinox, Spring DM。因为都是基于OSGi标准的,他们的大致用法和核心功能是一致的。一般来说一个OSGi的组件(Bundle)可以轻易的从一个框架迁移到另一个框架。框架的不同主要是体现在他们本身的设计和额外的服务上。根据我的一些经验,对这4个框架进行了一下比较,希望对刚接触OSGi或是由于如何选择OSGi框架的人有所帮助。
OSGI也叫JAVA动态模块系统,定义了一套模块应用开发的框架。OSGI容器的实现方案如Knopflerfish, Equinox, and Apache Felix允许你将应用分成多个功能模块,从而更方便地管理它们之间的相互依赖性。
通俗来说:OSGi 是由OSGi联盟发起的以Java为技术平台的动态模块化规范。
2. OSGi的优势:
-
模块化。模块化并不仅仅是把系统拆分为不同的块而已——这是JAR包就能够做的事情,真正的模块化必须考虑到模块中类的导出、隐藏、依赖、版本管理、生命周期变化和模块间交互等一系列的问题。
-
OSGi可以弥补java中资源精细化分的缺陷,加强架构的自约束能力。如果有开发人员在web层使用DAO直接操作数据库,或者在DAL层直接从HttpSession对象中取上下文信息,这样的代码也许能逃过测试人员的黑盒测试,但是显然是不符合软件开发基本理论的。OSGi可以清晰的分清各层的依赖关系,可以让Web层只依赖Service层的JAR包,程序员就无法访问到DAO;可以使DAL层没有依赖Servlet API的JAR包。程序员也就不能访问HttpSession对象了。
-
动态化。OSGi可以做到动态修复缺陷,不停机地增加或禁止某块功能、更新某个模块等。
-
你可以动态地安装、卸载、启动、停止不同的应用模块,而不需要重启容器。
-
你的应用可以在同一时刻运行同一个模块的多个版本。
-
OSGI在SOA领域提供成熟的解决方案,包括嵌入式,移动设备和富客户端应用等。
3. OSGi-可能遇到的问题:
- OSGi的入门门槛比较高,学习曲线比较曲折。OSGi规范由数十个子规范组成,包含了上千个不同用途的API接口
(OSGi规范显得这么庞杂的主要原因是实现模块化本身需要解决的问题就非常多)
- 增加系统不稳定的风险。最典型的ClassNotFoundException异常、OutOfMemoryError、类加载死锁等常见的问题
4. OSGi入门学习资源:
OSGi中文社区-http://osgi.com.cn/article/7289520