`
hz_chenwenbiao
  • 浏览: 1007919 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

你好,OSGi (第一部分): Bundles入门(翻译)(转)

    博客分类:
  • OSGI
阅读更多
新建、执行和管理OSGi容器中的Bundles

 


摘要:

 

OSGi(Open Service Gateway Initiative,开放式服务通路倡议)为开发和部署模块化应用和库定义了基础架构。在本文中,Sunil Patil为我们介绍了OSGi开发的概念,并使用Eclipse自带的OSGi容器Equinox创建了一个简单的Hello World应用;同时,他还为我们简单介绍了如何使用OSGi开发面向服务(SOA)的应用程序,及如何使用ServiceFactoryServiceTracter这两个类。
OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构。OSGi容器已有多家开源实现,比如KnoflerfishEquinoxApacheFelix。您可以通过这些容器,把您的应用程序劈分为多个模块单元,这样,您就可以更容易地管理这些模块单元之间的交叉依赖关系。
OSGi规范和Servlet规范及EJB规范类似,该规范定义了两种对象,一是容器对外提供的服务对象,另一个是容器和您的应用程序之间必须遵守的契约,其中,服务对象是容器要实现的。您如果想要在OSGi平台上进行开发,首先,您必须要使用OSGi API来创建您的应用,然后将之部署到OSGi容器中。从开发者的角度看,OSIG具有以下优点:
a) 您可以在不重启容器的情况下,动态地安装、卸载、启动和停止您的应用程序中的不同模块;
b) 对于您应用程序中的某一特定模块,容器可以同时运行该模块的多个版本;
c) OSGi为开发嵌入式应用、移动应用、富互联网应用(RIA)提供了非常优秀的基础架构
如果说您使用Servlet容器开发您的网络应用,使用EJB容器开发交易式应用,您可能会问,为什么我们还需要另外的容器呢?对这个问题的简短回答是,OSIG容器是专门为开发复杂的Java应用准备的,在这些应用的开发过程中,您非常需要将这些应用分割为一个个的模块。在本系列以后的文章中,我将针对这个问题进行展开并深入回答。


1. OSGi在企业开发中的应用
OSGi联盟(OSGiAlliance)19993月开始着手制定OSGi规范,其主要目的就是要制定一套开放式标准,以便向局域网及其中的设备提供可管理的服务;其基本思路是,一旦您在网络设备(如服务器和嵌入式设备)上使用了OSGi服务平台,您就可以在网络上的任何地方管理这些设备上运行的软件组件的生命周期,可以在后台对这些组件进行安装、升级或卸载,但不需要打断该设备的正常运行。
近年来,OSGi技术在嵌入式系统及网络设备市场得到广泛应用。现在,由于Eclipse的成功,OSGi在企业开发中逐渐成为切实可行的、较有价值的一种技术。


1.1. 业界对OSGi的支持逐渐上升
2003年,Eclipse开发团队开始想办法提高Eclipse工具集的模块化,以便让它成为更加动态的富客户端平台。Eclipse团队最终选中OSGi框架作为其组件的运行时模型,20046月发布的Eclipse3.0就是第一个基于OSGi平台的版本。现在几乎所有的企业应用服务器都支持OSGiSpring也通过一个叫“OSGi服务平台上的Spring动态模型(亦称之为OSGiSpring)”的项目来支持OSGi。该项目提供OSGi基础架构,以便我们在Spring的企业开发中更容易使用OSGi


2. 开放源码的OSGi容器
从企业开发者的角度看,OSGi容器的要求很低,您可以很容易地把它嵌入到企业应用中,比如我们在开发Web应用时,我们可以把这个Web应用分为多个模块,一个模块负责视图层,另一个模块负责DAO层,第三个模块负责数据访问层,如果我们使用OSGi容器来管理这些模块之间的交叉依赖,我们就可以在不用重启该Web应用的前提下,将DAO层从速度较慢的升级到速度较快的DAO
只要您的应用和OSGi规范兼容,您的应用就应该可以运行在任何OSGi容器中,现在比较流行的开放源码的OSGi容器有以下三种:
a) Equinox容器是参照OSGi规范第4版实现的,它构成了Eclipse IDE的核心模块化的Java运行时;它实现了OSGi规范4中规定的必须强制实现的功能,同时,它也实现了OSGi规范中大部分的可选功能;
b) KnoflerfishOSGi规范第3版和第4版的开源实现,它实现了OSGi规范规定的必须实现的功能及部分可选功能;
c) ApacheFelixApache软件基金会实现的OSGi开源容器,至本文截稿时为止,该容器还没有和OSGi规范完全兼容。在本文中,我们将使用Equonix作为我们的OSGi容器,如果您想了解更多关于ApacheFelixKnoflerfish容器的信息,请参考本文的资源部分。

 


3. 开发一个简单的Hello WorldBundle(OSGi绑定包)
OSGi中,软件是以Bundle的形式发布的。一个BundleJava类和其它资源构成,它可为其它的Bundle提供服务,也可以导入其它Bundle中的Java包;同时,OSGiBundle也可以为其所在的设备提供一些功能。Eclipse为开发OSGiBundle提供了优秀的支持,它不仅提供了向导来创建OSGi Bundle,而且还提供了内嵌的Equinox容器,您可以使用该容器执行和调试OSGi插件。请注意每一个Eclipse插件,从本质上说,都是一个OSGi Bundle,只是这个OSGiBundle多加了一些Eclipse专用的代码而已。下面我们来看看如何使用Eclipse开发一个简单的OSGiHelloWorld Bundle

 


3.1.新建Bundle
1) Eclipse中,点击“FileàNewàProject”菜单,您将会看到新项目创建对话框;
2) 在新项目对话框中,选择“Plug-inProject(插件项目)”并点击“Next(下一步)”按钮,您将看到插件项目对话框;
3) 在插件项目对话框中,请键入下列值:
Project Name(项目名称)com.javaworld.sample.HelloWorld
Target Platform(目标平台)an OSGiFrameworkàStandard OSGi框架à标准)
4) 对其它的要求输入值采用缺省值,并点击“Next(下一步)”按钮,您将会看到插件上下文对话框;
5) 在插件上下文对话框中,请选择缺省值并点击“Next(下一步)”按钮;
6) 在模板对话框中,请选择“Hello OSGiBundle(你好,OSGi包)”模板,然后点击“Finish(完成)”按钮完成该项目。
Eclipse将花几秒钟生成HelloWorld Bundle模板代码,它将新建两个文件:Activator.javaMANIFEST.MF,下面,让我们看看这两个文件:

 


3.1.1. Activator.java文件
源代码清单1.Activator.java
package com.javaworld.sample.helloworld;
importorg.osgi.framework.BundleActivator;
importorg.osgi.framework.BundleContext;
publicclass Activator implements BundleActivator {
public void start(BundleContext context)throws Exception {
System.out.println("Helloworld");
}
public void stop(BundleContext context)throws Exception {
System.out.println("GoodbyeWorld");
}
}


如果您想让您开发的Bundle能在其启动或关闭时通知自身,那么您应新建一个类,让它实现BundleActivator接口,同时,您还需要遵行下列规则:
这个实现了BundleActivator接口的类必须有一个public的、不带参数的构造函数,这样,OSGi框架就能调用该类的Class.newInstance()方法创建这个BundleActivator对象;
容器将调用Activator类的start()方法来启动Bundle,因此,我们可以在start()方法中执行一些资源初始化的操作,例如,我们可以在该方法中获取数据库连接,以备后用。这个start()方法的唯一参数是一个BundleObject对象,Bundles可以通过该对象和OSGi框架通讯,我们可以从该对象中获取OSGi容器相关的一些信息;如果某个Bundle抛出异常,容器将之置为“stopped(已停止)”状态,此时,这个Bundle就不能对外提供服务。
如果我们要关闭一个Bundle,容器将调用Activator类中的stop()方法。因此,我们可在stop()方法中执行一些资源清理任务,比如释放数据库连接。
一旦Activator类准备就绪,您就可以通过MANIFEST.MF文件把该包的合法名称传给容器。下面,我们就看看这个MANIFEST.MF文件。

3.1.2. MANIFEST.MF
文件
该文件是Bundle的部署描述文件,其格式和正常JAR文件包中的MANIFEST.MF文件相同,因此它由一系列的属性及这些属性对应的值组成,属性名位于每一行的开头,我们可以称其为属性头。OSGi规范规定,您可以使用属性头向容器描述您的Bundle。您的HelloWorld BundleMANIFEST.MF文件看起来应该如清单2所示:
源代码清单2. Hello World Bundle中的MANIFEST.MF文件
Manifest-Version:1.0
Bundle-ManifestVersion:2
Bundle-Name:HelloWorld Plug-in
Bundle-SymbolicName:com.javaworld.sample.HelloWorld
Bundle-Version:1.0.0
Bundle-Activator:com.javaworld.sample.helloworld.Activator
Bundle-Vendor:JAVAWORLD
Bundle-Localization:plugin
Import-Package:org.osgi.framework;version="1.3.0"


我们来看看这个文件中使用的属性头:
Bundle-ManifestVersion
该属性头告诉OSGi容器,本Bundle将遵循OSGi规范,数值2表示本BundleOSGi规范第4版本兼容;如果该属性的数值为1,那么则表示本包和OSGi版本3或更早版本兼容。

 


Bundle-Name
该属性头为本Bundle定义了一个简短的、可以阅读的名称;

 


Bundle-SymbolicName
这个属性头为本Bundle定义了一个唯一的、非本地化的名字;当您需要从别的Bundles中访问某一指定的Bundle时,您就要使用这个名字。

 


Bundle-Version
该属性头给出了本Bundle的版本号。

 


Bundle-Activator
该属性头给出了本Bundle中使用的监听器类名字,这个属性值是可选的。监听器将对Activator中的start()stop()方法监听。在程序清单2中,该属性头的值为com.javaworld.sample.helloworld.Activator

 


Bundle-Vendor
该属性头是对本Bundle发行商的表述。

 


Bundle-Localization
该属性头包含了本Bundle的本地化文件所在的位置,我们的HelloWorld Bundle中并没有本地化文件,但Eclipse IDE仍自动产生这个属性头


Import-Package
该属性头定义了本Bundle中引入的Java包,我将在本文后面的依赖性管理小节中详细讲解这个问题。现在,HelloWorld Bundle已经准备就绪,让我们来运行并看看它的输出结果。

3.2.
运行Bundle
我在前面提到,Eclipse IDE中有一个内嵌的EquinoxOSGi容器,您可以利用它来执行或调试OSGi Bundle。请按照下面步骤执行刚才的HelloWorld Bundle:
1 ) 单击RunàRun… 菜单(译者注,在Eclipse3.3中,请单击RunàOpen Run Diglog…菜单)
2) Eclipse会打开“Create,manage and run configuration(新建、管理和运行配置)”对话框,请双击”EquinoxOSGi Framework”按钮,Eclipse将打开运行时配置对话框;
3) 在上面的对话框中,将Name(名称)输入框的值改为HelloWorld Bundle
4) 您会注意到在Workspace插件目录下,有一个名为com.javaworld.sample.HelloWorld的插件,请选中它;在TargetPlatform(目标平台)下,请确保org.eclipse.osgi插件被选中。您的Run(运行)对话框应该看起来如图1所示:





1. HelloWorld Bundle的运行配置

5) 现在,请单击Run(运行)按钮,您应该看到控制台视图上打印出“HelloWorld”。其实,Eclipse是在控制台视图中打开OSGi控制台。
3.2.1. OSGi控制台
OSGi控制台是OSGi容器的命令行界面,您可以在这个控制台上启动、停止、安装、更新和删除Bundles。在EclipseIDE中,请点击该控制台视图获得焦点,然后按回车键,这时您可以看到OSGi提示符,如图2所示:(译者注,在Eclipse3.3中,如果您没有看到OSGi提示符,请在图1的运行配置中,点击Arguments标签,然后在ProgramArguments(程序参数)输入框中键入“-console”,然后再次运行该Bundle)


     

2. OSGi控制台和HelloWorldActivator.java


下面是几个经常使用的OSGi命令,您可以使用这些命令与OSGi容器进行交互。
ss: 该命令显示所有已安装的Bundles及它们的状态,它将显示Bundle IDBundle的简短名称及Bundle状态;
start<bundleid>: 该命令将启动一个Bundle
stop<bundleid>: 该命令将停止一个Bundle
update<bundleid>: 该命令使用新的JAR文件更新一个Bundle
install<bundleid>: 该命令将一个新的Bundle安装到OSGi容器;
uninstall<bundleid>: OSGi容器中卸载一个已安装的Bundle
请注意,这些命令是OSGi规范中规定的,因此,您可以使用它们和任何OSGi容器交互。

分享到:
评论

相关推荐

    OSGI 入门资料PDF

    OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建模块化和动态的Java应用程序。它为Java开发人员提供了一个框架,使他们能够构建可热插拔的组件,从而实现更灵活、可扩展和可维护的软件系统。在本...

    OSGi入门教程(OSGi Introduce)

    1. **插件化(Bundles)**:OSGi系统完全基于Bundles(类似于Java的jar包)构建,每个Bundle都是一个独立的模块,能够动态安装、更新或移除,实现了系统的热插拔功能。 2. **动态性**:OSGi提供了完整的交互机制,...

    Osgi in Action: Creating Modular Applications in Java Jun 2010

    在《OSGi in Action》这本书的第一章“OSGi Revealed”中,作者深入探讨了Java平台虽然取得了巨大的成功,但在构建模块化系统方面仍然存在不足。Java平台虽然具备良好的设计和持续进化能力,能够支持从小型移动设备...

    OSGi入门篇:生命周期层

    OSGi(Open Services Gateway Initiative)是一个基于Java语言的服务平台,提供了一种动态化、模块化的应用程序架构。在OSGi架构中,整个生命周期管理是十分重要的组成部分,它保证了应用能够动态地进行安装、启动、...

    精彩:OSGI入门以及提升

    OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和管理的模块。OSGI的核心是其服务导向架构,它为Java应用程序提供了一个动态、灵活的运行时...

    OSGi入门篇:服务层

    OSGi(Open Service Gateway Initiative)是一个Java社区定义的模块化服务平台,它允许在同一个运行环境中部署多个版本的同一个组件,而不会相互冲突,从而提供了一个动态的、模块化的运行时环境。OSGi规范定义了...

    OSGI 实例eclipse插件开发

    OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序由一系列可独立更新和替换的模块组成,这些模块称为“bundle”。在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse...

    OSGi入门资料-初探OSGi 的全文

    OSGi的入门资料,网上找的,初探OSGi 的全文

    OSGI入门和例子

    1. **模块系统**:OSGI的核心是模块化,它定义了一种基于Java导出和导入包的机制,使得不同bundle之间可以安全地共享代码。每个bundle都有自己的类路径,确保了类的隔离性和封装性。 2. **生命周期管理**:OSGI ...

    OSGi入门篇:模块层(by 静默虚空)

    在OSGi入门篇:模块层这篇文章中,作者静默虚空深入探讨了OSGi框架中模块层的基础知识以及设计模块层时OSGi联盟所做的考虑。OSGi模块层是框架中最基础的部分,它实现了Java的模块化特性,但又与Java现有的模块化特性...

    OSGI入门和整合Spring

    1. **配置Spring Bundle**:将Spring的应用上下文配置文件打包到一个OSGI bundle中。这个bundle会导出包含Spring配置的包,供其他bundle引用。 2. **创建OSGI服务**:在OSGI环境中,Spring的bean可以被声明为OSGI...

    killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip

    【标题】"killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip" 是一个基于OSGi的 Kill Bill 库,其中包含了SLF4J(Simple Logging Facade for Java)的OSGi兼容版本。SLF4J是一个为各种日志框架提供简单抽象的接口,...

    Spring OSGi 入门.pdf

    ### Spring OSGi 入门知识点详解 #### 一、Spring-DM简介 Spring Dynamic Modules (Spring DM) 是一种将Spring框架与OSGi模块化框架相结合的技术。它旨在利用Spring的强大功能来简化OSGi应用程序的开发流程。通过...

    OSGi 入门+进阶+实战

    OSGi(Open Services Gateway Initiative)是一种开放标准,用于创建模块化和可管理的Java应用程序。它的核心特性是基于服务的架构,允许动态发现、安装、卸载和升级软件组件,从而提高了灵活性和可维护性。OSGi技术...

    osgi规范r4..

    1. **OSGi Service Platform**:OSGi(Open Services Gateway Initiative)服务平台是用于构建动态、模块化Java应用程序的一种框架。它允许在运行时安装、更新或卸载软件模块(称为bundles),而不会影响其他正在...

Global site tag (gtag.js) - Google Analytics