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

OSGI入门:与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测试目录里,详细请看第一部分)。

Cmd命令代码 复制代码
  1. java -jar equinox.jar -console  
java -jar equinox.jar -console

 

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

Java代码 复制代码
  1. import org.osgi.framework.*;   
  2.   
  3. public class HelloWorldKiller implements BundleActivator {   
  4.     public void start(BundleContext context) {   
  5.         System.out.println("HelloWorldKiller searching...");   
  6.         Bundle[] bundles = context.getBundles();   
  7.         for (int i = 0; i < bundles.length; i++) {   
  8.             if ("HelloWorld".equals(bundles[i].getSymbolicName())) {   
  9.                 try {   
  10.                     System.out.println("Hello World found, " + "destroying!");   
  11.                     bundles[i].uninstall();   
  12.                     return;   
  13.                 } catch (BundleException e) {   
  14.                     System.err.println("Failed: " + e.getMessage());   
  15.                 }   
  16.             }   
  17.         }   
  18.         System.out.println("Hello World bundle not found");   
  19.     }   
  20.   
  21.     public void stop(BundleContext context) {   
  22.         System.out.println("HelloWorldKiller shutting down");   
  23.     }   
  24. }  
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文件。并将以下代码粘贴到里面。再次强调一下,在结尾处一定要留一个空行,否则程序无法运行。

Helloworldkiller.mf代码 复制代码
  1. Manifest-Version: 1.0  
  2. Bundle-ManifestVersion: 2  
  3. Bundle-Name: DBLoginBundle Plug-in   
  4. Bundle-SymbolicName: Login_DBLoginBundle   
  5. Bundle-Version: 1.0.0  
  6. Bundle-Activator: HelloWorldKiller   
  7. Bundle-ActivationPolicy: lazy   
  8. Bundle-RequiredExecutionEnvironment: JavaSE-1.6  
  9. Import-Package: org.osgi.framework;version="1.3.0"  
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进行打包。

Java代码 复制代码
  1. > javac -classpath equinox.jar HelloWorldKiller.java   
  2. > jar -cfm HelloWorldKiller.jar HelloWorldKiller.mf HelloWorldKiller.class  
> javac -classpath equinox.jar HelloWorldKiller.java
> jar -cfm HelloWorldKiller.jar HelloWorldKiller.mf HelloWorldKiller.class

 

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

Cmd控制台显示代码 复制代码
  1. id     State              Bundle   
  2. 0      ACTIVE           system.bundle_3.2.1.R32x_v20060919   
  3. 1      ACTIVE           HelloWorld_1.0.0  
  4. 2      INSTALLED     HelloWorldKiller_1.0.0  
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。你将会在控制台看到如下信息:

Cmd控制台输出代码 复制代码
  1. HelloWorldKiller searching...   
  2. Hello World found, destroying!   
  3. Goodbye EclipseZone Readers!  
HelloWorldKiller searching...
Hello World found, destroying!
Goodbye EclipseZone Readers!

 

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

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

Cmd控制台输出代码 复制代码
  1. id            State             Bundle   
  2. 0             ACTIVE          system.bundle_3.2.1.R32x_v20060919   
  3. 2             ACTIVE          HelloWorldKiller_1.0.0  
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的帮助文档。

  

分享到:
评论

相关推荐

    OSGI 入门资料PDF

    Spring是一个流行的Java应用框架,OSGI与Spring的结合可以提供更强大的模块化能力。Spring Dynamic Modules(Spring-DM)是用于OSGI的Spring扩展,它使得Spring应用可以无缝地在OSGI环境中运行。通过Spring-DM,你...

    OSGi入门篇:生命周期层

    BundleContext提供了与OSGi框架交互的执行时上下文环境,它用于访问框架提供的各种服务。而Bundle接口则代表了OSGi框架中的一个逻辑bundle。 6. 动态性与灵活性:OSGi框架的一个核心优势是其模块的动态性。开发者...

    OSGi入门教程(OSGi Introduce)

    2. **Eclipse集成开发环境**:Eclipse从3.0版本开始采用OSGi框架(Equinox),提升了性能、可扩展性,并简化了二次开发。 3. **企业级应用**:IBM WebSphere、BEA microServices、Apache Struts、Spring等均使用...

    Spring OSGi 入门.pdf

    ### Spring OSGi 入门知识点...以上内容为Spring OSGi入门的基本知识点,涵盖了Spring DM的基础概念、配置方法以及如何在OSGi环境中导出和引用服务等内容。这些知识点对于理解如何将Spring与OSGi结合使用具有重要意义。

    OSGi入门篇:服务层

    在OSGi框架中,服务层是位于应用程序之上的一层,它为服务提供者和消费者之间的交互提供了一种机制。这一层的主要目的是实现组件之间的松耦合通信,即组件不需要知道彼此的具体实现细节,仅通过服务接口进行通信。 ...

    OSGI资料,OSGI进阶,OSGI实战,OSGI入门和整合Spring

    《OSGI入门和整合Spring》则关注OSGI与Spring框架的结合,主要讨论: 1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用...

    osgi入门与实践

    ### OSGi 入门与实践 #### OSGi 的历史背景 OSGi,全称为 Open Service Gateway Initiative,从字面上理解,它最初被设计为一个面向服务的平台。1999 年,OSGi 联盟成立,旨在为通过网络向设备提供服务建立开放的...

    精彩:OSGI入门以及提升

    在OSGI入门阶段,首先要理解的是它的基本概念,如bundle(模块)、服务、生命周期管理和依赖管理。Bundle是OSGI中的核心组件,它类似于Java的JAR文件,但具有自己的元数据和生命周期。每个bundle可以导出和导入服务...

    《深入理解OSGi:Equinox原理、应用与最佳实践》迷你书

    本书《深入理解OSGi:Equinox原理、应用与最佳实践》深入剖析了OSGi技术的原理和应用,着重介绍了基于OSGi R5.0规范的内容,并结合了Equinox框架的实践经验,旨在帮助读者更好地理解和应用OSGi技术。 本书共分为四...

    OSGi 入门 学习 实战 进阶

    书中可能包含了源码分析,帮助读者理解OSGi框架的内部工作机制,以及如何优化和调试基于OSGi的应用。 《OSGi R4核心规范 《中英文》》是OSGi联盟发布的官方文档,包含了OSGi R4版本的详细规范,包括模块化系统、...

    OSGI 经典实例,入门

    本教程以经典实例为基础,旨在帮助新手快速入门OSGI,同时也对经验丰富的开发者具有参考价值。 首先,理解OSGI的基本概念至关重要。OSGI框架由一组称为"bundle"的模块组成,每个bundle都是一个自包含的Java程序单元...

    OSGi (Open Service Gateway Initiative)入门

    **OSGi入门** OSGi(Open Service Gateway Initiative)是一个开放标准,它定义了一种模块化系统,用于在Java平台上构建动态、可管理的应用程序。这个技术最初的目标是为家庭网络设备提供服务网关,但随着时间的...

    osgi入门

    **标题:“OSGi入门”** **描述:** 这篇博客文章主要介绍了OSGi(Open Services Gateway Initiative)的基础知识,包括它的起源、概念以及在Java开发中的应用。作者通过一个实际的例子来帮助读者理解如何使用OSGi...

    Spring OSGI 快速入门中文教程

    **三、Spring OSGi入门** 1. **环境搭建**:首先需要安装一个支持OSGi的运行时环境,如Apache Felix或Equinox,然后配置Spring OSGi容器,如Spring DM(现在已改名为SpringSource dm Server)。 2. **编写bundle**:...

    OSGI最佳实践

    服务机制则允许bundle之间进行松耦合的交互;版本化则确保bundle的向后兼容性。 3. OSGi的优势: OSGi带来的优势包括模块化开发、易于维护和更新以及减少资源浪费。模块化开发允许开发者独立开发和测试各个模块,...

    tomcat-osgi压缩包

    “相应的bundle”指的是在OSGi环境中运行的软件组件,它们是具有特定功能的自包含单元,可以通过OSGi框架进行加载、卸载和更新,无需影响其他服务。这些bundle可以是第三方库、应用程序模块或者系统服务,通过声明式...

    Tomcat-Osgi

    重复提及"Tomcat-Osgi JAR包"强调了这个组件在实现Tomcat与OSGi交互中的核心地位。 【标签】"Tomcat-Osgi JAR包"标签明确了我们要关注的是与Tomcat和OSGi集成相关的Java档案文件,它们是实现两者整合的基础。 ...

    osgi webservice入门

    OSGi的核心是其服务注册表,它允许模块之间通过发布和查找服务来进行交互。每个OSGi模块(称为bundle)都是一个独立的JAR文件,有自己的类加载器,这确保了模块间的隔离性。开发者可以通过定义元数据来控制bundle的...

Global site tag (gtag.js) - Google Analytics