原文请转至:http://developer.51cto.com/art/200909/152209.htm
本文是《你好,OSGi》系列的第二部分。之前曾介绍过OSGi是什么,下面将继续上篇介绍的内容,讲述一个简单的OSGi Bundle:Hello World是如何开发的。
51CTO编辑推荐:OSGi入门与实践全攻略
开发一个简单的Hello World的OSGi Bundle(OSGi绑定包)
在OSGi中,软件是以Bundle的形式发布的。一个Bundle由Java类和其它资源构成,它可为其它的Bundle提供服务,也可以导入其它Bundle中的Java包;同时,OSGi的Bundle也可以为其所在的设备提供一些功能。Eclipse为开发OSGiBundle提供了优秀的支持,它不仅提供了向导来创建OSGi Bundle,而且还提供了内嵌的Equinox容器,您可以使用该容器执行和调试OSGi插件。请注意每一个Eclipse插件,从本质上说,都是一个OSGi Bundle,只是这个OSGiBundle多加了一些Eclipse专用的代码而已。下面我们来看看如何使用Eclipse开发一个简单的OSGi的HelloWorld 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.java和MANIFEST.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 Bundle的MANIFEST.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表示本Bundle和OSGi规范第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 ID,Bundle的简短名称及Bundle状态;
start< bundleid>: 该命令将启动一个Bundle;
stop< bundleid>: 该命令将停止一个Bundle;
update< bundleid>: 该命令使用新的JAR文件更新一个Bundle;
install< bundleid>: 该命令将一个新的Bundle安装到OSGi容器;
uninstall< bundleid>: 从OSGi容器中卸载一个已安装的Bundle。
请注意,这些命令是OSGi规范中规定的,因此,您可以使用它们和任何OSGi容器交互。
读到这里,希望您对OSGi Bundle的开发有了一个大致的了解。
分享到:
相关推荐
"osgi helloworld"是一个入门级的示例,旨在帮助初学者理解OSGi的基本概念和工作原理。这个实例包括了两个部分:`server`和`client`,它们都是OSGi的bundle。 首先,我们来看`server` bundle。这个bundle通常扮演...
"OSGi HelloWorld实例"是一个典型的入门教程,旨在帮助初学者理解如何在OSGi环境中创建和运行一个简单的程序。 首先,我们需要了解OSGi的基本概念: 1. **模块(Bundle)**:在OSGi中,模块是软件的基本单元,它们...
在"OSGi -- Helloworld 学习记录一"这篇博文中,作者很可能是分享了他/她初次接触并实践OSGi时的经验,通过创建一个简单的HelloWorld示例来介绍这个技术的基础概念。 首先,我们需要理解OSGi的核心特性:模块化。在...
- `HELLOWORLD.MF`是Manifest文件,它包含了关于Bundle的重要元数据,如Bundle的名称、版本、依赖和其他配置信息。 - `步骤.txt`可能是运行示例的详细步骤指南,指导用户如何配置和启动OSGi环境以及部署和运行Bundle...
**示例应用**:压缩包中的"osgi_example"可能包含了一个简单的OSGi Bundle示例,例如,创建一个HelloWorld服务,其他Bundle可以注册和使用这个服务。 总结来说,基于Eclipse的Equinox框架开发OSGi Bundle应用,可以...
**IntelliJ IDEA OSGI HelloWorld程序详解** OSGi(Open Service Gateway Initiative)是一个Java模块化系统和标准,它允许开发人员将应用程序分解为独立的模块,这些模块可以在运行时动态地安装、卸载和升级,而不...
2. `src/main/java`: 存放Java源代码的目录,可能有HelloWorld相关的类。 3. `src/main/resources`: 可能包含资源配置文件或其他非Java资源。 4. `src/main/osgi`: 如果有的话,可能是OSGi特定的配置文件,如...
文章《OSGi开发环境建立和Hello World》详细介绍了如何搭建OSGi开发环境,并通过Hello World程序的开发实践来巩固前面入门篇的内容。 首先,需要了解Equinox是OSGi核心标准的一个完整实现,并且添加了一些额外的...
在本文中,我们将深入探讨如何使用Eclipse Luna版本配置OSGi环境,并通过一个HelloWorld示例来理解OSGi模块化系统的基本概念。首先,我们从标题和描述中了解到,这是一篇关于使用Eclipse Luna进行OSGi插件开发的教程...
"osgi_hello_world"项目是学习和理解OSGi基础知识的一个简单示例,通常用于演示如何在OSGi环境中创建和运行一个基本的“Hello, World!”程序。 在Java世界中,OSGi提供了一种管理类加载器和依赖关系的方法,使得...
### OSGi框架详解与首个HelloWorld项目实践 #### OSGi框架概述 OSGi(Open Service Gateway Initiative),作为一个强大的Java动态模块化平台,它的设计理念是实现真正意义上的模块化及动态化设计。这一理念体现在...
**2.7 Hello, World!** 创建第一个OSGi bundle是一个简单的练习,旨在熟悉基本的OSGi开发流程。 **2.8 Bundle生命周期** 了解bundle的生命周期对于正确地管理bundle的状态至关重要。 **2.9 增量开发** 在OSGi...
"osgi-basic-helloworld"是一个入门级别的OSGi项目,用于展示如何在Eclipse Mars集成开发环境中创建和运行一个简单的OSGi捆绑包。 首先,我们需要理解OSGi的核心概念: 1. **捆绑(Bundle)**:OSGi中的核心单元是...
创建一个HelloWorld bundle,我们需要编写一个主类,如`HelloWorld.java`,并在MANIFEST.MF中指定类路径和导出的包。例如,如果我们的主类在`com.example.helloworld`包下,MANIFEST.MF应包含以下内容: ``` ...
- **样例项目**:"samples"文件夹可能包含各种示例项目,如HelloWorld服务和消费者。 - **构建与运行**:使用Maven或Gradle构建Bundle,然后在OSGi运行时环境中启动。 通过阅读《Spring OSGi 入门.pdf》和实践...
至于压缩包中的"helloWorld"文件,它可能是示例中的一个基本模块,包含了简单的Hello World服务或客户端,用于演示OSGi的基本功能。这个模块可以作为理解OSGi、Maven和IntelliJ IDEA集成的起点。 总之,这个例子为...
return "Hello, World!"; } } ``` 4. **注册Jersey服务**: - 在OSGi环境中,我们需要注册Jersey作为服务。这可以通过实现`BundleActivator`接口并在`start()`方法中启动Servlet来完成。 ```java public class ...
在弹出的窗口中输入项目名称为`osgi.test.helloworld`。 2. **配置项目设置**:在接下来的向导界面中,保持默认的项目路径不变。在目标平台的选择上,由于我们的目标是创建一个通用的OSGi bundle,因此选择`equinox...