`

Getting Started with OSGi_ Part2

阅读更多

      欢迎回到EclipseZone的OSGi系列课程来!这是我们的第二次课——“与OSGi框架进行交互”

 

     上节课我们看了一个简单的Hello World Bundle,它在启动和停止的时候打印了一些信息。它继承了接口BundleActivator,并且实现了start和stop方法。我们来再看一下代码。特别是start方法和stop方法的实现,你是否注意到我们在方法里传入了一个参数——BundleContext。在这次的课程里,我们就来看一下BundleContext,以及我们可以用它来做什么。

 

      BundleContext是OSGi框架送给我们的Bundle的一张不可思议的门票。当我们需要同OSGi框架进行交互的时候,我们需要使用BundleContext。事实上,这是唯一同OSGi的API进行交互的途径。并且OSGi框架对每一个Bundle发放了门票,以便每一个Bundle在启动的可以通过BundleActivator与框架进行交互。

 

      如果你的Equinox也就是OSGi并没有停止的话,那你不需要启动它。如果它没有运行,请记住启动使用个这个命令将它启动(现将工作目录转移到OSGi测试目录里,详细请看第一部分)。

java -jar equinox.jar -console

 

      根据提示符输入“ss”,然后你将会看到上次已经安装的Hello World Bundle。即使你已经关闭了OSGi服务并且又启动了它,你依然会看到这个情况。这是因为OSGi框架会自动将它的启动到运行的状态保留在配置文件中。为了证明这个,我们将写一个Bundle,这个Bundle将会自动寻找并且卸载Hello World Bundle。我们可以在控制台里使用“uninstall”命令轻松的实现这个功能。并且我们将学习如何利用OSGi的API进行编程。所以,现在建立一个名叫“HelloWorldKiller”的Java文件,并且将以下代码复制粘贴到里面。

import org.osgi.framework.*;

public class HelloWorldKiller implements BundleActivator {
	public void start(BundleContext context) {
		System.out.println("HelloWorldKiller searching...");
		Bundle[] bundles = context.getBundles();
		for (int i = 0; i < bundles.length; i++) {
			if ("HelloWorld".equals(bundles[i].getSymbolicName())) {
				try {
					System.out.println("Hello World found, " + "destroying!");
					bundles[i].uninstall();
					return;
				} catch (BundleException e) {
					System.err.println("Failed: " + e.getMessage());
				}
			}
		}
		System.out.println("Hello World bundle not found");
	}

	public void stop(BundleContext context) {
		System.out.println("HelloWorldKiller shutting down");
	}
}

 

      然后我们同样创建一个名叫HelloWorldKiller.MF的manifest文件。并将以下代码粘贴到里面。再次强调一下,在结尾处一定要留一个空行,否则程序无法运行。

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: DBLoginBundle Plug-in
Bundle-SymbolicName: Login_DBLoginBundle
Bundle-Version: 1.0.0
Bundle-Activator: HelloWorldKiller
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"

 

      然后使用命令对这个Bundle进行打包。

> javac -classpath equinox.jar HelloWorldKiller.java
> jar -cfm HelloWorldKiller.jar HelloWorldKiller.mf HelloWorldKiller.class

 

       打包完后,我们回到OSGi控制台,使用命令“install file:HelloWorldKiller.jar”(“file”后是这个jar文件命)安装这个Bundle。然后使用“ss”查看目前的Bundle状态。大致情况如下:

id     State              Bundle
0      ACTIVE           system.bundle_3.2.1.R32x_v20060919
1      ACTIVE           HelloWorld_1.0.0
2      INSTALLED     HelloWorldKiller_1.0.0

 

      然后我们通过运行“start 2”这个命令来启动Hello World Bundle。你将会在控制台看到如下信息:

HelloWorldKiller searching...
Hello World found, destroying!
Goodbye EclipseZone Readers!

 

      注意到了最后一行的输出吗?那是我们最初的Hello World Bundle。因为在我们运行Hello World Killer之前,它是处于运行状态的。当它被卸载的时候,先要被停止。因此,BundleActivator的stop方法会被执行。

然后我们再次输入“ss”查看一下Bundle的运行状态。HelloWorld的Bundle消失了。变成了下面的情况:

id            State             Bundle
0             ACTIVE          system.bundle_3.2.1.R32x_v20060919
2             ACTIVE          HelloWorldKiller_1.0.0

 

      你可能通过上面的讲述惊奇的发现那里存在一个安全问题:我们可以通过任何一个Bundle卸载其他的Bundle。我们很幸运,OSGi有套全面的安全措施。这可以让我们在与OSGi框架进行交互的时候,灵活的控制每一个细节。简单的来说,你可以通过建立一个特殊的管理员Bundle来限制卸载其他Bundle的行为。然而,获得安全保障的工作最重要的是配置文件的定义。而我们这一系列的课程把焦点集中在代码上。

      以上就是这节课的全部内容。在下节课中,我们来看一下BundleContext接口并且看看我们能用它做什么。比如,我们是否可以用installBundle方法来进行一个Bundle的安装,或者查看运行中的Bundle的信息,并且打印出Bundle最近的修改时间和内容。为了更好的进行下堂课的学习,请先查阅一下OSGi Release 4 API的帮助文档。

 

 

分享到:
评论

相关推荐

    Getting Started with OSGi_ Part1

    在标题“Getting Started with OSGi Part1”中,指明了这是一个关于OSGi入门的系列文章中的第一部分。描述部分虽然为“NULL”,但可以从给定的内容中提取出文章的重点信息。标签“源码工具”可能意味着在文章的系列...

    Getting Started with OSGi_ Part3

    《OSGi初识系列教程——第三部分:模块间的依赖关系》 在OSGi(Open Service Gateway Initiative)框架中,理解并管理模块间的依赖关系是至关重要的。本篇教程将深入探讨这一主题,帮助开发者们更好地掌握OSGi环境...

    OSGI.rar_OSGI eclipse_eclipse osgi_java OSGI_osgi

    2. **OSGI架构**:OSGI框架的组成部分,如框架、服务注册表、生命周期管理(启动、停止、更新、卸载Bundle)等。 3. **Eclipse与OSGI**:Eclipse是如何基于OSGI构建的,每个插件如何作为OSGI Bundle运行,以及如何...

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

    《深入理解OSGi:以org.eclipse.osgi_3.7.0.v20110613及其源码为例》 OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它为开发人员提供了动态模块化的解决方案,使得Java应用程序能够更好地管理和...

    Oscar.rar_java OSGI_oscar_osgi_osgi oscar

    2. **类加载器**:OSGI使用独特的类加载机制,每个bundle有自己的类加载器,这使得不同bundle中的相同类可以并存,解决了Java传统的类加载冲突问题。 3. **服务注册和查找**:OSGI服务是组件间通信的关键,通过服务...

    OSGi.NET-master.zip_c#osgi_osgi_osgi.net github_模块化

    2. **C#版OSGi**:OSGi通常与Java关联,但这里我们讨论的是.NET平台的实现,即OSGi.NET。它保留了OSGi的核心特性,如服务注册、模块化、生命周期管理,同时适应了C#和.NET Framework的编程模型。 3. **模块化开发**...

    tomcat-osgi.rar_OsgiContentFactory_osgi_osgi tomcat 集成_osgi tom

    标题中的“tomcat-osgi.rar_OsgiContentFactory_osgi_osgi tomcat 集成_osgi tom”表明这是一个关于Tomcat服务器与OSGi框架集成的资源包,其中可能包含了如何在Tomcat中使用OsgiContentFactory来管理OSGi服务的内容...

    OSGi原理与最佳实践(完整版)&OSGi_in_action

    2. **模块化开发**:讲解如何使用OSGi模块化你的代码,减少依赖冲突,提高代码的重用性和可维护性。 3. **生命周期管理**:描述OSGi bundle的生命周期,包括启动、暂停、恢复和停止等状态,以及如何控制这些状态。 ...

    osgi_spring_dm_jr

    2. Spring DM的核心特性,如何在OSGi环境中管理Spring应用的bean和服务。 3. Java Runtime Environment在OSGi中的特殊性,如何支持每个bundle的独立运行环境。 4. 如何阅读和理解`osgi_platform`文件,可能涉及的...

    it_ismb_pert_osgi_dal_web-apis-源码.rar

    《IT_ismb_pert_osgi_dal_web-apis源码解析》 在现代软件开发中,模块化已经成为提升代码可维护性和复用性的重要手段。OSGi(Open Service Gateway Initiative)作为Java平台上的模块化系统,为构建可扩展、动态的...

    OSGi_R4_Spec_zh_cn_origional

    OSGi(Open Services Gateway Initiative)是一种开放的标准,用于创建模块化和动态的Java应用程序。R4是OSGi规范的一个版本,代表了第四代OSGi规范。这个文档集,"OSGi_R4_Spec_zh_cn_origional",包含了OSGi R4...

    org.eclipse.osgi_3.9.0

    org.eclipse.osgi_3.9.0.v20130529-1710.jar下载

    OSGi Technology 教程

    "Getting Started with OSGi 2 Interacting with the Framework.pdf"接着介绍了如何与OSGi框架交互,包括启动、停止、更新和安装捆绑包。此外,还会讨论如何使用OSGi框架API来管理和控制服务生命周期。 "Getting ...

    org.eclipse.osgi_3.8.1.dist.jar

    解决ubuntu用软件中心安装的eclipse启动异常问题(java.lang.ClassNotFoundException: org.eclipse.core.runtime.adapt)

    OSGI.zip_osgi_osgi原理

    2. **类加载器机制**:OSGI引入了一种层次化的类加载器结构,每个服务单元有自己的类加载器,可以控制对类的访问,实现类的隔离。这使得一个服务单元中的类只对自己可见,除非明确导出给其他服务单元。 3. **依赖...

    osgi.rar_gateway_open_open init_osgi_osgi code.r

    OSGi(Open Service Gateway Initiative)指OSGi Alliance组织制定的一个基于Java语言的服务(业务)规范——OSGi服务平台(Service Platform)。 它被广泛应用于嵌入式系统中,大名鼎鼎的eclipse也是基于此框架的,...

    OSGI.rar_osgi_practice

    2. **生命周期管理**:OSGI框架提供了对Bundle的完整生命周期管理,包括安装、启动、停止、更新和卸载。这种灵活性允许开发者在运行时动态调整应用程序的行为。 3. **依赖管理**:OSGI框架自动处理模块之间的依赖...

Global site tag (gtag.js) - Google Analytics