eclipse osgi
建立模块化系统有许多要求。 在Java世界以及许多其他领域中,开放服务网关计划(OSGi)被公认为模块化系统的成熟框架,其中包括桌面应用程序,Web应用程序,移动应用程序和中间件。 OSGi提供了基础结构来开发模块化,动态和面向服务的应用程序。 大多数特性和功能是通过OSGi规范和实施中的服务定义和提供的。 通过了解几个OSGi核心服务的概念和用法,我们能够利用这些服务以及Eclipse IDE来构建满足复杂需求的轻量级模块化应用程序。
样例应用程序
该示例应用程序是一个数据收集器,它从不同种类的数据源中检索数据并将其解析为统一的预定义数据格式,以进行进一步处理。 有多个系统具有完全不同的数据格式定义以及检索它们的方式。 在一个示例中,应用程序生产者或所有者期望第三方供应商根据应用程序发布的API为特定数据源实现流程逻辑。 理想情况下,数据收集器客户端应集成第三方代码并运行它们,而无需对现有代码,配置或部署结构进行任何更改。 这是构建模块化系统的典型要求,我们将介绍如何使用OSGi核心服务来实现它。
要释放OSGi的全部功能,尽管并不复杂,但必须仔细设计应用程序体系结构。 已经发表了多篇文章讨论OSGi应用程序的设计原理,我鼓励您通读它们。 (请参阅相关主题 。)
图1显示了示例数据收集器应用程序的体系结构。 该应用程序由三种类型的捆绑包组成:数据收集器框架捆绑包,文本解析器捆绑包和收集器捆绑包。
图1.示例数据收集器应用程序体系结构

框架捆绑包是整个应用程序的核心组件。 它可以是捆绑软件(为其他捆绑软件提供收集器和向导UI API),也可以是客户端(使用其他功能捆绑软件的服务)。 通过将API和客户端捆绑软件合并为一个捆绑软件,第三方数据收集器开发人员可以将最少数量的捆绑软件jar导入其IDE中以实现API,然后在Eclipse中运行并测试整个应用程序。 收集器捆绑包提供数据收集服务和向导页面服务。 另一方面,收集器捆绑包还充当客户端,调用框架捆绑包提供的文本解析器API,为此,单独的解析器捆绑包将提供服务。
所有这些捆绑包都是松散耦合的,并通过OSGi核心服务相互交互。 结果,即使在部署应用程序之后,也可以轻松添加,删除,挂起或升级除框架束以外的所有束。 这是自动化软件交付过程的重要功能。
让我们演示实现和部署一个小的但完全形成的OSGi应用程序的过程和实践。
定义OSGi项目布局
我们需要为Eclipse中的每个捆绑包创建一个新的插件项目。 以下内容假设您具有以前在Eclipse中创建OSGi捆绑软件的经验或知识。 此外,请确保下载最新版本的Eclipse IDE以及单独的Equinox SDK。 建议使用Eclipse 3.4或更高版本。
如图1所示 ,至少需要三个捆绑包项目–框架捆绑包,文本解析器捆绑包和数据收集器捆绑包。 定义项目布局,例如包和文件夹层次结构设计,非常重要。 让我们以框架包项目为例, 如图2所示 。
图2.示例项目布局

创建OSGI-INF
文件夹以存储此捆绑包中的所有OSGi组件定义文件。 (组件概念将在后面介绍。)包是根据功能类别创建的。 我们需要在早期阶段计划对其他捆绑包可见的打包文件,以避免捆绑包严重耦合。 在示例框架包中,导出了以下两个包。
-
dw.sample.dc.api
–包含所有要实现的API。 -
dw.sample.dc.consts
–包含束之间共享的常量和枚举,例如事件参数。
使用OSGi声明式服务注入服务
模块化和面向服务是OSGi规范中的关键概念。 公开实现类受OSGi框架支持,但不建议使用。 取而代之的是,从编程的角度来看,期望捆绑包通过发布和使用服务或类的实例相互交互。 OSGi提供了两种方法来实现此目的:
- 通过OSGi服务层提供的
BundleContext
对象在服务注册表中注册和检索服务。 - 利用OSGi R4规范中的声明式服务。
声明式服务(DS)声明了组件模型概念。 组件是使用组件定义文件定义的Java对象,该文件用于提供服务和检索引用的服务。
组件的生命周期由OSGi容器管理。 而且,引用的服务实例是动态注入到组件中的。 DS将根据预定义的策略处理服务查找,绑定或取消绑定到组件。 结果,开发人员能够使用纯净的代码生成高度动态的系统。
创建第一个服务组件
让我们从一个简单的案例开始:数据收集器框架捆绑包定义了文本解析器API,而文本解析器捆绑包提供了默认的解析器服务。
在框架包中,在导出的dw.sample.dc.api
包中定义服务API。 参见清单1 。
清单1.文本解析器API
public interface ITextParser {
public String parseText(String input);
}
在文本解析器捆绑项目中,必须首先将dw.sample.dc.api
包导入清单中,以确保可以由当前捆绑类加载器加载接口类。 其次,创建一个类来实现上述接口。
最后一个最重要的步骤是将实现类定义为组件,这需要创建一个组件定义文件并将其注册在捆绑清单中。 为了简化过程,让我们使用Eclipse提供的向导(在旧版本中可能不可用):
- 右键单击解析器包中的OSGI-INF文件夹,然后选择“
New>Component Definition
。 - 指定刚刚创建的实现类文件作为组件类,以及定义文件和组件名称,然后单击Finish 。
- 在图形组件定义配置窗口中,切换到“ 服务”选项卡,然后将框架包的服务接口类指定为该组件提供的服务。 参见图3 。 下面。