人人都会OSGI--实例讲解OSGI开发

上传人:飞*** 文档编号:43504321 上传时间:2018-06-06 格式:DOCX 页数:17 大小:188.96KB
返回 下载 相关 举报
人人都会OSGI--实例讲解OSGI开发_第1页
第1页 / 共17页
人人都会OSGI--实例讲解OSGI开发_第2页
第2页 / 共17页
人人都会OSGI--实例讲解OSGI开发_第3页
第3页 / 共17页
人人都会OSGI--实例讲解OSGI开发_第4页
第4页 / 共17页
人人都会OSGI--实例讲解OSGI开发_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《人人都会OSGI--实例讲解OSGI开发》由会员分享,可在线阅读,更多相关《人人都会OSGI--实例讲解OSGI开发(17页珍藏版)》请在金锄头文库上搜索。

1、人人都会人人都会 OSGI-OSGI-实例讲解实例讲解 OSGIOSGI 开发开发OSGI(Open Services Gateway Initiative),或者通俗点说 JAVA 动态模块系统, 定义了一套模块应用开发的框架。OSGI 容器实现方案如 Knopflerfish, Equinox, and Apache Felix 允许你把你的应用分成多个功能模块,这样通过 依赖管理这些功能会更加方便。和 Servlet 和 EJB 规范类似,OSGI 规范包含两大块:一个 OSGI 容器需要实现 的服务集合;一种 OSGI 容器和应用之间通信的机制。开发 OSGI 平台意味着你 需要使用

2、OSGI API 编写你的应用,然后将其部署到 OSGI 容器中。从开发者的 视角来看,OSGI 提供以下优势:1. 你可以动态地安装、卸载、启动、停止不同的应用模块,而不需要重启 容器。 2. 你的应用可以在同一时刻跑多个同一个模块的实例。 3. OSGI 在 SOA 领域提供成熟的解决方案,包括嵌入式,移动设备和富客户 端应用等。OK,你已经有个 Servlet 容器来做 web 应用,有了 EJB 容器来做事务处理,你 可能在想为什么你还需要一个新的容器?简单点说,OSGI 容器被设计专门用来 开发可分解为功能模块的复杂的 Java 应用。企业应用领域的企业应用领域的 OSGIOSGI

3、OSGI 规范最初是由 OSGI 联盟在 1999 年 3 月发起。它的主要目的是成为向网络 设备传输服务管理的开放规范。核心思想是一旦你向网络设备中添加 了一个 OSGI 服务平台,你可以在网络中的任意位置管理该设备上的服务组件。这些服 务组件可以任意安装,更新或移除而不会对设备产生影响。多年来,OSGI 技术只出现在嵌入式系统和网络设备市场。现在,Eclipse 使 OSGI 在企业开发领域焕发出新的光彩。OSGIOSGI 受到越来越广泛的支持受到越来越广泛的支持 2003 年,Eclipse 开发团队开始寻找一种使 eclipse 成为一种功能更动态、工 具更模块化的富客户端平台。最终,

4、他们的目光锁定在 OSGI 框架上。 Eclipse3.0,2004 年 6 月发布,是基于 OSGI 技术搭建的首个 Eclipse 版本。几乎所有企业应用服务提供商支持或计划支持 OSGI。Spring 框架同样支持 OSGI,通过 Spring DM(Spring Dynamic Modules for OSGI Service Platforms)项目,可以让我们在 Spring 上更方便的应用 OSGI。开源开源 OSGIOSGI 容器容器 从企业应用开发者的角度看,OSGI 容器侵入性非常小,你可以方便地将其嵌入 一个企业应用。举个例子来说,假设你在开发一个复杂的 web 应用。你

5、希 望将 这个应用分解成多个功能模块。一个 View 层模块,一个 Model 层模块,一个 DAO 模块。使用嵌入式 OSGI 容器来跨依赖地管理这些模块可以让你随 时更新 你的 DAO 模块却不需要重启你的服务器。只要你的应用完全符合 OSGI 规范,它就可以在所有符合 OSGI 规范的容器内运 行。现在,有三种流行的开源 OSGI 容器:1. Equinox 是 OSGI Service Platform Release 4 的一个实现。是 Eclipse 模块化运行时的核心。 2. Knopflerfish 另一个选择。 3. Apache Felix 是 Apache 软件基金会赞助

6、的一个 OSGI 容器在这篇文章里我们使用 Equinox 作为我们的 OSGI 容器。尝试开发一个尝试开发一个 HelloHello WorldWorld bundlebundle 在 OSGI 的领域,发布的软件是以 bundle 的形式出现。bundle 由 java class 类和资源文件组成,向设备所有者提供功能,同时可以为其他的 bundles 提供 服务。Eclipse 对开发 bundles 提供了强大的支持。 Eclipse 不仅仅提供创建 bundles 的功能,它还集成了 Equinox 这个 OSGI 容器,你可以在其上开发和调 试 OSGI 组件。其实所有的 Ecl

7、ipse 插件都是使用 Eclipse 规范代码写的 OSGI bundle。接下来,你将可以学到如何使用 Eclipse IDE 开发一个 Hello world osgi bundle。开始开发开始开发 bundlebundle 我们一步步的开始:1. 启动 Eclipse,依次点 File New Project。 2. 选择 Plug-in Project,next。 3. 输入 Project Name 项目名称,比如 com.howard.sample.HelloWorld,Target Platform(目标平台)里的 an OSGI framework,选择 standard。

8、 4. 剩下的保持默认,next。 5. 下个对话框也默认,next。 6. 然后选择 Hello OSGI Bundle 作为模版。Finish。Eclipse 会飞快的为你创建 Hello world bundle 的模版代码。主要包含两个文 件:Activator.java 和 MANIFEST.MF。Activator.java 的代码如下所示:Java 代码 1. import org.osgi.framework.BundleActivator; 2. import org.osgi.framework.BundleContext; 3. public class Activato

9、r implements BundleActivator 4. public void start(BundleContext context) throws Exception 5. System.out.println(“Hello world“); 6. 7. public void stop(BundleContext context) throws Exception 8. System.out.println(“Goodbye World“); 9. 10. 如果你的 bundle 在启动和关闭的时候需要被通知,你可以考虑实现 BundleActivator 接口。以下是定义 Ac

10、tivator 的一些注意点:1. 你的 Activator 类需要一个公有的无参数构造函数。OSGI 框架会通过类 反射的方式来实例化一个 Activator 类。 2. 容器启动 bundle 过程中负责调用你的 Activator 类的 start 方法。 bundle 可以在此初始化资源比如说初始化数据库连接。 start 方法需要 一个参数,BundleContext 对象。这个对象允许 bundles 以取得 OSGI 容 器相关信息的方式和框架交互。如果某一个 bundle 有异常抛出,容器 将对该 bundle 标记为 stopped 并不将其纳入 service 列表。 3.

11、 容器关闭的时候会调用你的 Activator 类方法 stop(),你可以利用这个 机会做一些清理的操作。MANIFEST.MFMANIFEST.MF 这个文件是你的 bundle 的部署描述文件。格式和 Jar 里的 MANIFEST.MF 是一样 的。包含的不少名值对,就像如下:Xml 代码 1. Manifest-Version: 1.0 2. Bundle-ManifestVersion: 2 3. Bundle-Name: HelloWorld Plug-in 4. Bundle-SymbolicName: com.howard.sample.HelloWorld 5. Bundl

12、e-Version: 1.0.0 6. Bundle-Activator: com.howard.sample.helloworld.Activator 7. Bundle-Vendor: HOWARD 8. Bundle-RequiredExecutionEnvironment: JavaSE-1.6 9. Import-Package: org.osgi.framework;version=“1.3.0“ 分别来看下:Bundle-ManifestVersion数值为 2 意味着本 bundle 支持 OSGI 规范第四版;如果是 1 那就是支持 OSGI 规范第三版。Bundle-Nam

13、e给 bundle 定义一个短名,方便人员阅读Bundle-SymbolicName给 bundle 定义一个唯一的非局部名。方便分辨。Bundle-Activator声明在 start 和 stop 事件发生时会被通知的监听类的名字。Import-Package定义 bundle 的导入包。Hello World bundle 完成了,接下来我们运行一下。执行执行 bundlebundle 1. 点击 Run Run Configuration2. 在左边的 OSGI Framework 选项里右键 new ,创建一个新的 OSGI Run Configuration 3. 名字随便取好了,

14、我们取个 OSGi hello world。 4. 你会注意到中间的窗口里 Workspace 项目里有一子项 com.howard.sample.HelloWorld,将其勾选上,其他的不用管。这时的状 态应该如下图。 5. 点击 Run 按钮。在控制台你应该可以看见点东西了。那是叫做 OSGI 控制 台的东东。与子相伴,还有一个“Hello world“。OSGIOSGI 控制台控制台 OSGI 控制台是一个 OSGI 容器的命令行界面。你可以利用它做些诸如启动,关 闭,安装 bundles,更新和删除 bundles 等操作。现在,点击 OSGI 控制台所在 的位置,回车,你就会发现可以

15、输入命令了。这时的 OSGI 控制台应该如下图:下面列出一些常用的 OSGI 命令,你可以试着和 OSGI 容器交互。ss 显示已安装的 bundles 的状态信息,信息包括 bundle ID,短名,状态等等。start 启动一个 bundlestop 关闭一个 bundleupdate 载入一个新的 JAR 文件更新一个 bundleinstall 安装一个新的 bundle 到容器中uninstall 卸载一个已在容器中的 bundle依赖管理依赖管理 OSGI 规范允许你把你的应用分解成多个模块然后管理各个模块间的依赖关系。这需要通过 bundle scope 来完成。默认情况下,一个

16、 bundle 内的 class 对其 他 bundle 来说是不可见的。那么,如果要让一个 bundle 访问另一个 bundle 里的 class 要怎么做?解决的方案就是从源 bundle 导出包,然后在目标 bundle 里导入。接下来我们对此做一个例子。首先,我们需要先创建一个 com.howard.sample.HelloService bundle,我们将 通过它导出一个包。然后,我们在 com.howard.sample.HelloWorld 这个 bundle 里导入包。导出包导出包 1、创建名为 com.howard.sample.HelloService 的 bundle,创建步骤和前面一 样。2、在这个 bundle 内,添加一个 com.howard.sample.service.HelloService.java 接口,代码如下:Java 代码 1. public inte

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号