`
sunxboy
  • 浏览: 2869512 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

利用 Eclipse 开发基于 OSGi 的 Bundle 应用(转)

阅读更多
  

级别: 初级

杨 晓飞 (yangxiaofei2000@hotmail.com), 软件工程师

2006 年 7 月 17 日

开 放服务网关协议 (Open Services Gateway Initiative),简称 OSGi,为网络服务定义了一个标准的、面向服务的计算环境,为用户提供了开放的、面向服务组件的、易于部署的编程模型,这个编程模型允许用户将定义好的 接口规范绑定到 OSGi 运行环境中的特定Service,在构件 SOA 面向服务为中心的企业应用的过程中,OSGi 技术正发挥越来越重要的作用。在本文中,将介绍 OSGi 的概念和体系结构,并且利用 Eclipse 3.2 开发一个基于 OSGi 规范的服务应用 Bundle。通过学习本文,读者可以了解到如何开发和部署基于 OSGi 规范的 Bundle 应用。

OSGi 规范简介

OSGi 联盟建立于 1999 年,是一个非赢利机构,旨在建立一个开放的服务规范。OSGi 规范为网络服务定义了一个标准的、面向组件的计算环境,它最初的目的就是为各种嵌入式设备提供通用的软件运行平台,屏蔽设备操作系统与硬件区别的中间件平 台,通过这个平台,可以对不同软件商提供的应用(OSGi 中称为 Bundle)进行组件的生命周期管理的能力,如应用组件可以从运行中被安装、升级或者移除而不需要中断设备的操作,应用组件可以动态的发现和使用其他库 或者应用程序。由于 OSGi 技术具有服务组件模块化、动态加载应用等优点,正被越来越多的领域关注,如嵌入设备制造业、汽车制造业、企业应用等。目前,OSGi 联盟发布的最新的 OSGi 服务规范为 4.0,读者可以查阅参考资料了解详细信息。





回页首


OSGi 体系结构

OSGi 的体系架构是基于插件式的软件结构,包括一个 OSGi 框架和一系列插件,在 OSGi中,插件称为 Bundle,其中,OSGi 框架规范是 OSGi 规范的核心部分,它提供了一个通用的、安全可管理的 Java 框架,通过这个框架,可以支持 Bundle 服务应用的部署和扩展。Bundle 之间可以通过 Import Package 和 Require-Bundle 来共享 Java 类,在 OSGi 服务平台中,用户通过开发 Bundle 来提供需要的功能,这些 Bundle 可以动态加载和卸载,或者根据需要远程下载和升级。OSGi 体系结构图如图 1 所示:


图示1 OSGi 体系结构
图示1 OSGi 体系结构

其中:

Execution Environment:

Bundle 应用所倚赖运行的 Java 执行环境,如 J2SE-1.4、CDC-1.0 等都是可用的执行环境。

Modules:

模块层定义了 Bundle 应用的加载策略。OSGi 框架是一个健壮并且严格定义的类加载模型。在大多数 Java 应用中,通常只有一个单独的 ClassPath,它包含了所有的 Java 类文件和资源文件,OSGi基于Java技术,对于每个实现了 BundleActivator 接口的 Bundle 应用,为它生成一个单独的 ClassLoader,使得 Bundle 应用的组织更加模块化。

Life Cycle:

生命周期层可以动态地对 Bundle 进行安装、启动、停止、升级和卸载等操作。该层基于模块层,提供了一组 API 来控制 Bundle 应用的运行时操作。

Service Registry 和 Services:

OSGi 服务层定义了一个集成在生命周期层中的动态协作模型,是一个发布、动态寻找、绑定的服务模型。一个服务通常是一个 Java 对象实现了特定的服务接口,并且通过服务注册,被绑定到 OSGi 的运行环境中。Bundle 应用可以注册发布服务,动态绑定服务,并且在服务注册状态改变时,可以接受到事件消息等。

Security:

OSGi 的安全管理是基于 Java2 安全体系的,贯穿在 OSGi 平台的所有层中,它能够对部署在 OSGi 运行环境中的 Bundle 应用进行详细的管理控制。





回页首


Bundle 生命周期的状态

在一个动态扩展的 OSGi 环境中,OSGi 框架管理 Bundle 的安装和更新,同时也管理 Bundle 和服务之间的依赖关系。一个 Bundle 可能处于以下六个状态,如图 2 所示:


图示 2 Bundle 状态图
图示 2 Bundle 状态图

INSTALLED:安装完成,本地资源成功加载。

RESOLVED:依赖关系满足,这个状态意味该Bundle要么已经准备好运行,要么是被停止了。

STARTING:Bundle正在被启动,BundleActivator的start()方法已经被调用但是还没有返回。

STOPPING:Bundle正在被停止,BundleActivator的stop()方法已经被调用但是还没有返回。

ACTIVE:Bundle 被成功启动并且在运行。

UNINSTALLED:bundle被卸载并且无法进入其他状态。

Bundle接口定义了getState()方法来返回Bundle的状态。





回页首


OSGi 标准服务

在 OSGi 平台之上,OSGi 联盟定义了很多服务。服务是由一个 Java Interface 来定义的,Bundle 可以实现这个接口并且把服务注册到服务注册表中去,用户可以从注册表中找到需要的服务来使用,并且可以响应特定服务的状态改变,如服务注册和服务取消。下 面简单介绍一下 OSGi Release 4 的一些主要服务。OSGi 框架提供了权限管理服务,包管理服务和最初加载系统服务。这些服务是 OSGi 框架的一部分并且管理着 OSGi 框架的运作。

Permission Admin Service:权限管理是指 Bundle 是否许可其他的 Bundle 的代码。当前的或者其他的 Bundle 的权限可以通过这个服务来操作,一旦被设定权限,马上就生效。 Package Admin Service:Bundle 之间可以共享包内的 Java 类和资源,bundle 的更新可能需要 OSGi 框架重新解析 Bundle 之间的依赖关系,这个服务提供了 OSGi 服务平台中包的共享状态信息。

Start Level Service:Start Level是指一些在特定Bundle起动之前必须运行或者初始化的一系列 bundle。Start Lever Service 可以设置当前OSGi服务框架初始的Start Level,并且可以指定和查询特定Bundle的Start Level。





回页首


使用 Eclipse 开发 Bundle 应用

Equinox 框架是 Eclipse 组织基于 OSGi Release 4 的一个实现框架,它实现了 OSGi 规范的核心框架和许多标准框架服务的实现。关于Equinox项目的详细信息,请查阅参考资料信息。在本文中,我们使用 Eclipse 3.2 平台开发两个基于 OSGi 的 Bundle 应用,其中第一个 Bundle 应用声明、实现并注册了一个姓名查询服务,用于判断所给姓名是否在已定义的查询列表中;第二个 Bundle 应用查询并引用第一个 Bundle 应用所注册的姓名查询服务,如果用户所给的姓名包含在查询列表中,将返回正确的信息,最后,将开发的 Bundle应用部署的 Equinox OSGi 框架中,用户可以在 OSGi 控制命令行中输入命令来查询关于框架和 Bundle 应用的具体信息。读者可以从参考资料中获得本文 Bundle 应用的源代码。

(1)创建 Plug-in Project,在 Eclipse 3.2 开发环境中,从菜单栏选择 File > New > Project... ,打开 New Project 向导,可以看到有Plug-in Project创建向导,创建一个Plug-in 项目。项目名为 example 的 Bundle 应用,该应用实现并注册了一个姓名查询服务,实现了 BundleActivator 接口。选择 Equinox 框架作为 Bundle 应用运行的 OSGi 服务平台。


图示 3 Plug-in 项目向导
图示 3 Plug-in 项目向导

(2)实现OSGi服务通常需要两个步骤,首先定义所提供服务的接口,然后实现这个服务接口。在本例中,我们创建一个姓名查询服务用来查询所给姓名是否有效。首先定义姓名查询接口NameService.java。下面是该接口的源代码:


NameService Interface 源代码
package example.service;
/**
 * A simple service interface that defines a name service.
 * A name service simply verifies the existence of a Name.
**/
public interface NameService {
	/**
     * Check for the existence of a Name.
     * @param name the Name to be checked.
     * @return true if the Name is in the list,
     *         false otherwise.
    **/
	public boolean checkName(String name);
}

该服务接口很简单,只包含一个需要实现的方法。为了将服务接口和服务实现相分离,方便其他 Bundle 引用该服务,我们通常需要将该服务接口单独放在一个包内,本例中,存放NameService.java 接口的 Java 包为 example.service。接下来,需要实现 NameService 接口,并且注册该服务。在本例中,我们用内部类实现了该接口,下面是该 Bundle 应用的部分源代码。


Example Bundle部分源代码
	public void start(BundleContext context) throws Exception {
		Properties props = new Properties();
		props.put("ClassRoom", "ClassOne");
		context.registerService(NameService.class.getName(), new NameImpl(),
				props);
	}
private static class NameImpl implements NameService {
		// The set of names contained in the arrays.
		String[] m_name = { "Marry", "John", "David", "Rachel", "Ross" };
		/**
		 * Implements NameService.checkName(). Determines if the passed name is
		 * contained in the Array.
		 * 
		 * @param name
		 *            the name to be checked.
		 * @return true if the name is in the Array, false otherwise.
		 */
		public boolean checkName(String name) {
			// This is very inefficient
			for (int i = 0; i < m_name.length; i++) {
				if (m_name[i].equals(name)) {
					return true;
				}
			}
			return false;
		}
	} 
	

在start()方法中,利用BundleContext注册一个姓名查询服务,并且为该服务设置相关属性以便服务查询。在实现姓名查询服务时,我们简单定义了一个静态数组用于存放有效的姓名信息。

(3)定义Bundle描述文件MANIFEST.MF,Bundle应用example的MANIFEST.MF文件如下:


MANIFEST.MF文件信息
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Example Bundle
Bundle-SymbolicName: example
Bundle-Version: 1.0.0
Bundle-Activator: example.osgi.Activator
Bundle-Localization: plugin
Import-Package: org.osgi.framework;version="1.3.0"
Export-Package: example.service

其中,Bundle-Activator属性指明了实现BundleActivator接口的类,该类用来启动和停止Bundle应用。Export-Package属性指定了该Bundle输出的共享包,该属性可以使其他的Bundle应用引用我们所定义的服务接口。

(4)创建项目名为exampleClient的Bundle应用,该应用在OSGi平台上查寻并引用example Bundle应用已经注册的姓名查询服务,然后从标准输入读入用户所输入的姓名信息,判断所输入姓名是否有效。exampleClient应用的部分源代 码如下,读者可从参考资料中获得完整源代码。


ExampleClient Bundle部分源代码
	public void start(BundleContext context) throws Exception {
		ServiceReference[] refs = context.getServiceReferences(
				NameService.class.getName(), "(ClassRoom=*)");
		if (refs != null) {
			try {
				System.out.println("Enter a blank line to exit.");
				BufferedReader in = new BufferedReader(new InputStreamReader(
						System.in));
				String name = "";
				// Loop endlessly.
				while (true) {
					// Ask the user to enter a name.
					System.out.print("Enter a Name: ");
					name = in.readLine();
					// If the user entered a blank line, then
					// exit the loop.
					if (name.length() == 0) {
						break;
					}
					// First, get a name service and then check
					// if the name is correct.
					NameService nameservice = (NameService) context
							.getService(refs[0]);
					if (nameservice.checkName(name)) {
						System.out.println("The Name is Correct.");
					} else {
						System.out.println("The Name is Incorrect.");
					}
					// Unget the name service.
					context.ungetService(refs[0]);
				}
			} catch (IOException ex) {
			}
		} else {
			System.out.println("Couldn't find any name service...");
		}
	}
	





回页首


Bundle的部署及运行

在Eclipse平台中,选择File-->Export...菜单,将开发的example和exampleClient两个Bundle 应用导出成Jar文件,以便将它们部署到OSGi服务平台中。选择将要运行的Bundle应用,鼠标右键点击,在弹出菜单中,选择Run AS-->Equinox FrameWork来启动OSGi服务平台。在Equinox启动配置控制台中,可以为Bundle应用设置默认的Start Level和Bundle应用是否需要自动启动等选项。在本例中,为了讲解如何安装及启动Bundle应用,只将example Bundle应用设为自动启动,而exampleClient Bundle应用需要我们用命令安装及启动。

当OSGi Equinox FrameWork启动后,在OSGi控制命令台中输入ss命令,可以查看OSGi服务平台中已经安装的Bundle应用信息及其状态。如图4所示,可以 看到当前OSGi服务平台中有两个Bundle处于Active状态,其中,system.bundle_3.2.0.v20060328为OSGi框架 的系统Bundle,而example_1.0.0为注册姓名查询服务的Bundle应用,1.0.0为Bundle应用的版本号。


图示4 Bundle信息查询
图示4 Bundle信息查询

在OSGi控制命令台中利用install命令安装exampleClient Bundle应用,用ss命令查看安装后的Bundle应用信息及其状态。如图5所示:


图示5 安装Bundle
图示5 安装Bundle

在OSGi控制命令台中利用start命令安装exampleClient Bundle应用,用户可输入姓名,利用姓名查询服务来判断所输入姓名是否有效,用ss命令查看启动后的Bundle应用信息及其状态。如图6所示:


图示6 启动Bundle
图示6 启动Bundle

用户在在OSGi控制命令台中,可利用stop命令来停止指定的Bundle应用,close命令用来停止并退出OSGi控制命令台。关于OSGi Equinox FrameWork控制台命令的详细信息,可查看参考资料。





回页首


总结

OSGi服务框架提供了开放的、面向服务的、易于部署的编程模型,在构件面向服务为中心的企业应用的过程中,OSGi 技术正发挥越来越重要的作用。目前,Eclipse 3.2 体系架构是参照OSGi实现的,Equinox框架是 Eclipse 组织基于OSGi Release 4 的一个实现框架,它实现了OSGi 规范的核心框架和许多标准框架服务。在本文中,我们利用Eclipse 平台开发了两个Bundle应用,并且在Bundle应用中,声明、实现、注册并引用了一个简单的服务,最后,将Bundle应用部署到Equinox OSGi服务框架中。通过本文,读者可以了解如何开发和部署基于OSGi规范的Bundle应用。

评论

相关推荐

    基于Eclipse的Equinox框架开发OSGi Bundle应用

    【标题】基于Eclipse的Equinox框架开发OSGi Bundle应用 在Java世界中,OSGi(Open Services Gateway Initiative)是一种模块化系统,它允许开发者创建可独立更新和依赖管理的模块,即Bundle。Eclipse的Equinox是...

    OSGI 实例eclipse插件开发

    在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse插件。 首先,Eclipse是一个开放源代码的集成开发环境(IDE),它支持多种编程语言的开发,而OSGI则为Eclipse提供了一个强大的插件系统。通过OSGI,开发者可以...

    基于Eclipse开发OSGI的简单实例

    **基于Eclipse开发OSGI的简单实例** OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它允许在单个JVM上动态地部署、管理、发现和使用服务。Eclipse是一个广泛使用的开源集成开发环境(IDE),它...

    基于EQUINOX的 OSGI BUNDLE 运行例子

    描述中提到,这个例子包括了ECLIPSE下的OSGi平台包,这意味着我们可以利用Eclipse IDE来辅助开发和测试OSGi应用。设置`JAVA_HOME`和`BIN`环境变量是为了确保Java编译器`javac`的可用性,这是任何Java项目的基础。 ...

    OSGI.rar_OSGI eclipse_eclipse osgi_java OSGI_osgi

    3. **Eclipse与OSGI**:Eclipse是如何基于OSGI构建的,每个插件如何作为OSGI Bundle运行,以及如何通过Eclipse插件系统利用OSGI的灵活性。 4. **模块化开发**:如何将应用程序分解为可独立升级的模块,降低耦合度,...

    org.eclipse.osgi_3.7.0.v20110613及源码

    Eclipse IDE本身就是一个基于OSGi的平台,各个插件作为独立的bundle进行管理。此外,Spring Dynamic Modules(Spring DM)和Apache Felix等开源项目也使用OSGi来构建可扩展的系统。 六、挑战与优势 尽管OSGi提供了...

    基于OSGi和Spring开发Web应用教程

    总的来说,基于OSGi和Spring的Web应用开发结合了两者的优点:OSGi提供了模块化和动态部署的能力,而Spring则带来了方便的依赖管理和服务注册。通过Spring-DM,开发者可以在OSGi环境中享受到Spring的便利,构建更灵活...

    org.eclipse.osgi-3.8.0

    通过 "org.eclipse.osgi-3.8.0.v20120529-1548.jar" 这个 JAR 文件,开发者可以集成这个特定版本的 Eclipse OSGi 框架到他们的项目中,利用其模块化和动态性的优势来构建更加灵活和可扩展的应用程序。

    基于OSGi的Web应用开发系列(全).pdf

    OSGi(Open Service Gateway Initiative...理解并掌握这些工具和技术对于成功开发基于OSGi的Web应用至关重要。通过本系列教程,读者将逐步了解如何解决上述问题,如何在OSGi环境中规范SSH开发,以及如何保持开发效率。

    Equinox开发OSGi应用程序

    为了开发基于OSGi的应用程序,需要使用实现了OSGi标准的框架。目前市场上有几种流行的OSGi框架: 1. **Equinox**:这是Eclipse项目中使用的OSGi框架,也是Eclipse强大插件体系的基础。由于得到了IBM的支持,Equinox...

    基于osgi构建小例子

    通过这个基于Eclipse 3.5和JDK 1.6的OSGi示例,你可以深入了解OSGi的模块化概念、服务模型以及动态管理特性,这对于理解现代Java应用的架构和开发流程至关重要。实践这个例子将有助于你成为更熟练的OSGi开发者。

    OSGI技术教程 - Eclipse公司从OSGi技术中看到未来

    随着技术的不断进步,OSGi将在企业级应用开发中扮演越来越重要的角色,特别是在那些需要频繁更新和扩展的服务场景中。Eclipse公司对OSGi技术的关注表明了这一趋势,并且随着Swordfish等项目的不断发展,我们可以期待...

    基于OSGi的面向服务的组件编程.pdf

    开发过程中,可以利用Eclipse的OSGi运行时环境进行调试和测试,观察bundle之间的交互。 举例来说,我们可以构建一个简单的系统管理程序,它可能包含用户管理、资源管理和日志记录等多个模块,每个模块作为一个独立...

    使用Equinox开发OSGI应用程序工程及源码

    以下是基于Eclipse 3.3的Equinox OSGi开发的主要知识点: 1. **OSGi基础知识**:理解OSGi的核心概念,包括模块(Bundle)、服务、生命周期(启动、停止、更新、卸载)以及依赖管理。每个OSGi模块(Bundle)都是一个...

    OSGI.rar_OSGI eclipse_osgi

    通过学习这些资源,你可以了解到如何创建、配置和管理OSGI Bundle,如何在Eclipse中开发和调试OSGI插件,以及如何利用OSGI的动态性来优化大型Java项目。理解并掌握OSGI将有助于提升你的Java开发技能,尤其是在构建...

    org.eclipse.osgi-3.7.2

    在软件开发领域,Eclipse OSGi作为一种模块化系统,为Java应用程序提供了强大的可扩展性和灵活性。它允许开发者将复杂的应用程序分解为一组独立、可重用的服务,这些服务可以在运行时动态地启动、停止、更新和依赖...

    使用Equinox开发OSGi应用程序

    由于IBM的强力支持,Equinox不仅具有良好的文档和社区资源,也成为开发者进行OSGi应用开发的首选框架。 【OSGi应用开发】 开发OSGi应用程序通常包括以下几个步骤: 1. **环境准备**:确保拥有一个支持OSGi R4的...

    Eclipse-OSGi.pdf

    云计算平台如西安尤埃信息技术有限公司提供的尤埃SaaS引擎,就是利用了Eclipse-OSGi框架来支持其SaaS应用商店的开发和运营。SaaS应用商店允许SaaS运营商运营平台,SaaS提供商基于平台提供的工具包开发应用并上传,而...

Global site tag (gtag.js) - Google Analytics