Java SWT动态加载界面(将界面的每个部分做成模块,然后由主程序load或者调用)

OSGI服务平台提供在多种网络设备上無需重启的动态改变构造的功能为了最小化耦合度和促使这些

可管理,OSGi技术提供一种面向服务的架构它能使这些组件动态地发现对方。OSGi联

服务器、配置、日志、安全、用户管理、

等很多公共功能标准组件接口这些组件的兼容性

实现可以从进行了不同优化和使用代价的鈈同计算机服务提供商得到。然而服务接口能够基于专有权基础上开发。

因为OSGi技术为集成提供了预建立和预测试的

子系统所以OSGi技术使伱从改善产品上市时间和降低开发成本上获益。因为这些组件能够动态发布到设备上所以OSGi技术也能降低维护成本和拥有独一无二的新的配件市场机会。[1]

安全机制是建立在Java和

的设计对很多结构进行了限

制例如病毒中经常遇到的

溢出是不可能发生的。Java语言中的访问控制符限淛了代码可见性

OSGI平台通过使用私有类(在Java中不能用标准方式使用的机制)扩展了该模型。Java2安全模型提供了一个完整模块检查代码对于资源的可访问性OSGI增加了完全动态的权限管理,简化了操作者和

OSGI联盟已经定义了很多协议服务这些服务将外部协议映射为OSGI服务。HTTP服务(HttpService)该HTTP服務是servlet运行器bundles提供servlets,这些服务端小程序基于

成为可用的OSGi服务平台的动态更新功能使HTTP服务成为一个非常具有吸引力的Web服务器,它能伴随着噺的servlet被更新如果需要可以远程更新而无需重启。

)是一个正在形成中的消费电子标准OSGi中的UPnP服务在一个UPnP网络上将设备映射到服务注册中。同样它也可以将OSGi服务映射到UPnP网络。这是发布版本3中的推荐规范

)基于设备管理树为移动设备管理提供了一个完整规定。DMT管理服务定义該树如何被访问和/或者在OSGi服务平台中被扩充

OSGI规范的核心组件是OSGI框架。这个框架为

(被叫做组件(bundle))提供了一个标准环境整个框架可鉯划分为一些层次:

L0层执行环境是Java环境的规范。Java2配置和子规范像

等等,都是有效的执行环境OSGi平台已经标准化了一个执行环境,它是基於基础轮廓和在一个执行环境上确定了最小需求的一个小一些的变种该执行环境对OSGi组件是有用的。

L1模块层定义类的装载策略OSGi框架是一個强大的具有严格定义的类装载模型。它基于Java之上但是增加了模块化。在Java中正常情况下有一个包含所有类和资源的类路径。OSGi模块层为┅个模块增加了私有类同时有可控模块间链接模块层同安全架构完全集成,可以选择部署到部署

防御系统,或者由厂商决定的完全由鼡户管理的系统

L2生命周期层增加了能够被动态安装、开启、关闭、更新和

的bundles。这些bundles依赖于于具有类装载功能的模块层但是增加了在运荇时管理这些模块的

。生命周期层引入了正常情况下不属于一个应用程序的动态性扩展依赖机制用于确保环境的操作正确。生命周期操莋在安全架构保护之下使其不受到

L3层增加了服务注册。服务注册提供了一个面向bundles的考虑到动态性的协作模型bundles能通过传统的类共享进行協作,但是类共享同动态安装和卸载

不兼容服务注册提供了一个在bundles间分享对象的完整模型。定义了大量的事件来处理服务的注册和删除这些服务仅仅是能代表任何事物的Java对象。很多服务类似服务器对象例如HTTP服务器,而另一些服务表示的是一个真实世界的对象例如附菦的一个蓝牙手机。这个服务模块提供了完整安全保障该服务安全模块使用了一个很聪明的方式来保障bundles之间通信安全。

在该框架之上OSGi聯盟定义了很多服务。这些服务通过一个Java接口指定bundles能够实

现这个接口,并在注册服务层注册该服务服务的

在注册库中找到它,或者当咜出现或者消失时做出响应这个同

架构使用Web服务进行发布的方式相似。

两者主要不同是Web服务总是需要传输层这个使它比采用直接方法調用的OSGi服务慢几千倍。同时OSGi组件能够对这些服务的出现和消失做出响应。更多的信息可以从OSGi服务平台发行版本4手册或者

下载中找到需偠注意的是每一种服务都是抽象定义的,与不同计算机服务商的实现相独立

OSGi框架提供一个权限管理服务,一个包管理服务和一个开始级別服务这些服务是一个可

的操作。框架服务如下:

通过这种服务进行维护一旦设置了它们,权限服务立即激活

包管理(PackageAdmin)bundles同类和资源分享包。bundles的更新可能需要系统重新计算这些依赖这个包管理服务提供关于系统的实际包分享状态和能够刷新已经共享的包。也就是取消依赖和重新计算依赖。

启动级别(StartLevel)启动级别是一个bundles集合它们应该同时运行或者应该在其它已经启动以前被初始化。启动级别服务设置当前嘚启动级别为每个bundle排一个启动级别和审核当前的设置。

处理者支持一个提供者模型然而,这是一个单件不可能在一个象OSGi可能有很多提供者的协作环境上使用它。此服务规范使任何组件提供额外的URL处理者

系统服务提供水平功能,它在每个系统是必须的日志服务,配置管理服务设备访问

连接器服务和参数服务都是系统服务的一个方面。

日志服务(LogService)日志信息警告,调试或者错误信息通过日志服务来处悝的它接受日志实体并分派这些实体到订阅了这个信息的其他bundles。

管理服务(ConfigurationAdminService)该服务提供一个设置和获取配置信息的灵活、动态模型

设备訪问服务(DeviceAccessService)设备访问是OSGi为一个新的设备匹配一个驱动,并自动下载一个实现该驱动的bundles的机制这个可用作即插即用方案。

和验证目的的用户信息数据库

的可访问性,同Windows注册表或者Java参数类相似

组件运行时服务(ComponentRuntime)服务的动态特性--它们能够在任何时间来去自由--使编写

变得更难。组建运行时规范通过提供一个基于依赖声明的XML文件来简化处理这些动态方面

部署管理服务(DeploymentAdmin)OSGi的主要部署格式是bundle,它是一个JAR/ZIP文件部署管理提供第二种可选格式:部署包。部署包能够将bundles和相应资源联接成可被安装和卸载的单个交付完整的资源处理器模型允许用户代码扩充资源類型。

事件管理服务(EventAdmin)很多OSGi事件有特定的类型化的

使其很难接收和过滤事件。事件服务提供一个泛化的基于主题的事件机制这个规范包括为所有已存框架和服务事件的映射。

应用程序管理服务(ApplicationAdmin)OSGibundle模型不同于依赖于启动和关闭形式的典型的桌面或者

应用程序模型该应用程序管理服务提供了传统应用程序模型和它所要求的管理设施。

这篇文档介绍如何使用OSGi框架的一个实现——Equinox来教你如何配置一个简单的OSGi开发环境并且在这个环境上开发一个HelloWorld程序,这其中会涵盖前面的入门篇讲到的三个层次的内容让你在实践的同时巩固之前了解的内容。话不哆说我们开始吧! [2]

1 OSGi开发环境的建立

从代码角度来看,Equinox其实就是OSGi核心标准的完整实现并且还在这个基础上增加了一些额外的功能(比如為框架增加了命令行和程序执行的入口)。我们在之前入门篇讲解的都东西其实都是OSGi核心标准的一小部分其实它的核心就是一个jar包,这個jar包既能执行(作为标准Java包的特性)也是一个bundle(Manifest里面含有OSGi bundle特有的元数据)。

现在你需要知道的就是我们能够利用Equinox项目的代码来运行一個实实在在的OSGi框架,框架启动后你就可以将你开发好bundle放到里面运行。

Equinox在Eclipse官方网站上有下载里面列出了各个版本供我们选择:

在这里,峩们使用3.7版本的Equinox下载好以后放在一个单独的文件夹下(这里我的路径是E:\OSGi framework\equinox)

1.3 从命令行启动框架

如果出现osgi>的提示符,就说明启动成功了

Equinox的控制台的部分基本命令如下(区分大小写):

将URL表示的bundle安装到框架中

简单显示所有bundle的状态

展示安装的bundle和注册的服务

在上一节中大家看到启動和控制框架的方法,是相当简单的一个过程不过单单只是运行环境还不够,我们还需要开发环境

现在右边只有一个Runing Platform的,我们任务是點击“Add…”按钮来增加一个我们自己的的platform进入如下界面:

选择默认的第一个就好,点击next

再点击这里的“Add…”:

选择你的Equinox的jar包所在的路徑,然后点击finish,回到刚才的界面:

这时候你就会发现里面多出来了你刚刚设置的路径路径后面描述的“1 plug-ins available”则就是说的我们放置的Equinox的jar包。

继續点击finish回到最开始的界面

这里面现在已经自动包含了Equinox的jar包了,点击Run看看运行的效果:

Eclipse的控制台中也出现来了osgi的提示符,说明你已经成功启动了

你可以试试刚才讲的那些命令,看看能输出些什么(比如上图中我输入了ss) [2]

至此,开发环境已经建立完毕(这个project只是为了演礻怎么建立不会在接下来的内容中用到,可删之) [2]

现在可谓是万事具备,只欠Helloworld了为了将OSGi框架的三个层次都涵盖到,这个Helloworld可能会比其怹你见到的OSGi Helloworld程序要复杂一点点如果对代码中的一些API感到生疏,记得回到之前的入门篇中找到对应的内容这样对你理解代码会有帮助。裏面的关键代码已经用黄色高亮显示(出于篇幅考虑,代码中的import语句都省略)

首先我们创建一个工程org.serc.helloworld在这个工程里面,我们创建一个包含sayHello方法的接口准备作为服务接口:

然后,对这个接口进行实现:

这个类实现的sayHello所做的工作就是输出一个在对象构造的时候得到的helloString 字符串

为了将这个接口暴露出来,我们需要在MANIFEST文件中加入如下条目:

接下来为了把这个服务注册到框架中,我们定义了一个Activator:

为了让这个Activator能够工作需要在MANIFEST文件中做如下定义:

可能光看代码会比较不容易看清楚程序的执行流程,下图表示了这几个类的各个功能的相互依赖关系整个关系从Hello接口的定义开始;然后到Hello接口被实现,得到HelloImpl;再到Activator将HelloImpl注册为框架中的一个服务再到HelloUser通过与框架交互得到刚才注册的服务,并且使用这个服务从而输出字符串;最后一个可选流程是当我们stop

通过上面的工作我们得到了两个自己定义的bundle:

2.5 利用命令行查看程序执荇过程中框架状态的变化

2.4其实只给出了一个结果,如果你还不太清楚这个结果具体是怎么出来的那么这一节的内容应该能够帮助你更好嘚理解输出结果的过程。下面我们通过Equinox的一些命令行来一步一步安装和执行bundle并且查看过程中框架的状态变化,来让你们搞清楚这个结果昰怎么来的

然后点击Run,这时候就不会立即输出Hello OSGi字符串了,现在我们先用“ss”命令查看bundle 的状态:

在用services命令查看当前已经注册的服务我們会看到一大堆的系统服务中多出来如下一项服务

这显然是我们在start以后注册上去的,但是现在还没有任何一个bundle在使用这个服务

这时就输絀了“Hello, OSGi”的字符串

那么如果我们先启动9号bundle而不启动8号bundle会怎么样呢?大家可以试一试因为我们在代码中已经对没有服务的异常情况做叻处理,届时会有相应的输出

大家可以看见刚才注册的服务已经被注销了,现在我们执行refresh 11(也就是刚才的9号bundle)来重新执行其中BundleActivator的start方法

可見Hello服务已经不复存在了从这里我们可以看出来,其实Bundle的启动顺序也是一个需要注意的环节有时候你所定义的bundle是具有顺序敏感性的,必須要某些前置bundle启动了以后后面的bundle才能正确启动。 [2]

这篇文档是入门篇的最后一章了希望读者在花时间看完这4篇文档并且动手实践后能够囿所收获,并且对OSGi框架的工作原理及其优势能有一个比较清晰的了解和认识[2]

作者:周志明 & 谢小明,出版时间:.

内容简介:本书共14章分4個部分。第一部分(第1章):走近OSGi主要介绍了什么是OSGi以及为什么要使用OSGi。第二部分(第2~4章):OSGi规范与原理对最新的OSGi R5.0中的核心规范进荇了全面的解读,首先讲解了OSGi模块的建立、描述、依赖关系的处理然后讲解了Bundle的启动原理和调度管理,最后讲解了与本地及远程服务相關的内容第三部分:OSGi服务与Equinox应用实践(第5~11章),不仅详细讲解了OSGi服务纲要规范和企业级规范中最常用的几个子规范和服务的技术细节还通过一个基于Equinox的BBS案例演示了Equinox的使用方法,最重要的是还通过源码分析了Equinox关键功能的实现机制和原理第四部分:最佳实践(第12~14章),总结了大量关于OSGi的最佳实践包括从Bundle如何命名、模块划分、依赖关系处理到保持OSGi动态性、管理程序启动顺序、使用API基线管理模块版本等各方面的实践技巧,此外还介绍了Spring DM的原理以及如何在OSGi环节中进行程序测试

作者:陆阳,出版时间:.

RCP软件产品各个组成部分的构建方法鉯及Eclipse RCP扩展的使用和扩展点的开发,掌握这些技术知识的读者将能构建一个结构完整的Eclipse RCP软件并解决软件开发过程中遇到的故障;实战篇(苐13~15章)详细讲解了Eclipse RCP与Spring OSGi框架、Hibernate ORM框架、JPA规范、Maven工具的整合,以及它与Java的模块化设计

简介:由北京大学软件工程国家工程研究中心“软件协同研发支撑技术”组维护的一个模块化动态化开发技术的公益社区。初学者、进阶者和大牛都可以在这里分享技术和经验自由的交流和学習,在贡献和收获中充实自己为更多的学生、研究者和从业者提供更广阔的交流平台。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信