`
yumenami
  • 浏览: 4527 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Felix入门与实践(一)

 
阅读更多

首先,我假设你已经了解OSGi相关的一些概念,如果没有,可以看看官方的文档。

我们从创建一个监听OSGi Service事件的bundle开始。这个小例子并不会包含太多的东西,只是打印出注册以及未注册的Service的详细信息而已。下一篇我才会开始介绍实现了Service的bundle,这次只是通过一个范例来加深对于创建bundle基础知识的理解。

OSGi框架通过与bundle唯一对应的BundleContext来访问一个bundle,而得到BundleContext必须实现BundleActivator接口。这个接口有两个方法,start()和stop()。当bundle的被start或者stop的时候,BundleContext将作为参数传入这两个方法,然后这两个方法才会被调用。下面的源代码是一个bundle,当然它实现了BundleContext接口,同时这个bundle添加了自身作为Service事件的监听器。

 

package tutorial.example1;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceEvent;

/**
 * This class implements a simple bundle that utilizes the OSGi
 * framework's event mechanism to listen for service events. Upon
 * receiving a service event, it prints out the event's details.
**/
public class Activator implements BundleActivator, ServiceListener
{
    /**
     * Implements BundleActivator.start(). Prints
     * a message and adds itself to the bundle context as a service
     * listener.
     * @param context the framework context for the bundle.
    **/
    public void start(BundleContext context)
    {
        System.out.println("Starting to listen for service events.");
        context.addServiceListener(this);
    }

    /**
     * Implements BundleActivator.stop(). Prints
     * a message and removes itself from the bundle context as a
     * service listener.
     * @param context the framework context for the bundle.
    **/
    public void stop(BundleContext context)
    {
        context.removeServiceListener(this);
        System.out.println("Stopped listening for service events.");

        // Note: It is not required that we remove the listener here,
        // since the framework will do it automatically anyway.
    }

    /**
     * Implements ServiceListener.serviceChanged().
     * Prints the details of any service event from the framework.
     * @param event the fired service event.
    **/
    public void serviceChanged(ServiceEvent event)
    {
        String[] objectClass = (String[])
            event.getServiceReference().getProperty("objectClass");

        if (event.getType() == ServiceEvent.REGISTERED)
        {
            System.out.println(
                "Ex1: Service of type " + objectClass[0] + " registered.");
        }
        else if (event.getType() == ServiceEvent.UNREGISTERING)
        {
            System.out.println(
                "Ex1: Service of type " + objectClass[0] + " unregistered.");
        }
        else if (event.getType() == ServiceEvent.MODIFIED)
        {
            System.out.println(
                "Ex1: Service of type " + objectClass[0] + " modified.");
        }
    }
}

 

 

完成bundle的Java代码之后还不够,我们还需要定义一个包含了meta-data信息的manifest文件,这样OSGi框架才能“操作”这个bundle。manifest文件要和编译好的Java Class打包成一个Jar,而这个Jar包实际上就是一个bundle。我们接下来创建一个名为manifest.mf的文件,内容如下:

Bundle-Name: Service listener example
Bundle-Description: A bundle that displays messages at startup and when service events occur
Bundle-Vendor: Apache Felix
Bundle-Version: 1.0.0
Bundle-Activator: tutorial.example1.Activator
Import-Package: org.osgi.framework

 

上面的meta-data信息大部分只是为了维护方便,实际上只有Bundle-Activator属性以及Import-Package属性是OSGi框架必须的。Bundle-Activator属性为框架指明了实现了BundleActivator接口的类。当OSGi框架start某个bundle的时候,将创建一个该属性指定的类的实例,同时调用该实例的start()方法;同样框架stop该bundle的时候,实例的stop()方法将被调用。Import-Package属性指定了这个bundle所依赖的外部类。所有的bundle必须导入org.osgi.framework这个类,因为它包含了OSGi类的核心定义。所有的包依赖关系都会由OSGi框架来验证以及处理。(注意,manifest文件最后一行之后必须有一个回车符,否则最后一行的内容将会被框架忽略。)

 

然后就可以开始编译源代码了,我们需要把felix.jar添加到classpath中(Felix的bin目录中可以找到这个jar包),然后在命令行中运行:

javac -d c:\classes *.java

 

上面的命令将会编译classes目录下所有的源代码,并将class二进制字节码输出到指定的子文件夹tutorial\example1中。编译完成之后,就可以把class文件和之前写好的bundle的manifest文件打包成jar。接着在命令行中运行:

jar cfm example1.jar manifest.mf -C c:\classes tutorial\example1

 

一个打包好的bundle就到手了,用Felix的Shell就可以安装并运行这个bundle,比如:

start file:/c:/tutorial/example1.jar

 

上面的命令会自动安装并start这个bundle。当然我们也可以手动安装并且运行。Felix的Shell有install和start两个命令,分别运行一下就OK。另外stop命令可以stop指定的bundle,而shutdown则是关闭整个Felix环境。

分享到:
评论

相关推荐

    osgi入门与实践

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

    OSGi and Apache Felix 3.0 Beginner's Guide

    这本书为想要入门OSGi和Apache Felix的开发人员提供了一个详细的学习路径,涵盖了基础知识到实践应用的各个环节。学习完这本书之后,开发人员将能够使用Felix框架构建自己的模块化应用程序,并理解OSGi技术如何在...

    OSGI原理与最佳实践

    本书是国内第一本关于OSGI的书籍,旨在为广大开发人员提供一个关于OSGI从入门到深入的完成资料。通过大家熟悉的petstore的例子让大家能够更好地了解基于OSGi实现的模块化,动态化的JAVA系统。

    OSGI原理最佳实践(包含源代码)

    是一本适合新接触OSGI开发学习的一本很好的书,本书介绍了Equinox, Spring-DM和Felix这三个常用的OSGi容器的使用、开发、以及WebApplication的开发部署;介绍了OSGi的规范和Core Framework和Layer。包含书中的用例源...

    OSGi原理与最佳实践

    本书基于作者多年使用OSGi的经验而编写,涵盖了...最后对OSGi知识进行深入讲解,通过对OSGi规范和实现框架(Equinox、Felix、Spring-DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi。

    OSGI入门实践

    OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础的架构。OSGi容器已经有多家开源的实现,比如:knoflerfish、Equnox、Apache的Felix。你可以通过这些容器,把你的应用程序划分为多个模块单元...

    OSGI原理与最佳实践(清晰)

    多年使用0SGi的经验而编写,涵盖了0SGi从入门到深入的...最后对0SGi知识进行深入讲解,通过对0SGi规范和实现框架(Equinox、Felix、Spring—DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi

    OSGI 经典实例,入门

    5. **felix或equinox等OSGI实现**:熟悉至少一种OSGI容器,比如Apache Felix或Eclipse Equinox,它们提供了运行OSGI应用的平台。 通过分析这两个示例源码,你可以深入理解OSGI的工作原理,包括bundle间如何交互、...

    精彩:OSGI入门以及提升

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

    Spring OSGI 快速入门中文教程

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

    OSGi 入门+进阶+实战

    4. **felix或equinox**:Felix和Equinox是两个常用的OSGi运行时实现,它们提供了API和框架,用于构建和运行OSGi应用。 5. **Blueprint或Declarative Services**:这两种是OSGi中的服务配置方式,Blueprint更接近XML...

    osgi入门

    作者通过一个实际的例子来帮助读者理解如何使用OSGi,使初学者能够快速入门。 **标签:“源码”,“工具”** **正文:** OSGi是一种Java模块化系统,它为Java应用程序提供了一个动态的运行时环境。在Java世界中,...

    spring-osgi 入门手册和代码

    - **环境准备**:安装一个 OSGi 容器,如 Apache Felix 或 Equinox,这些都是 Spring OSGi 支持的容器。 - **创建 bundle**:将 Spring 应用打包为 OSGi bundle,确保所有依赖都被包含并正确配置版本。 - **配置 ...

    equinox快速入门

    7. **运行时环境**:为了运行Equinox应用,你需要一个OSGi运行时,如Equinox本身或Felix。你可以通过命令行或脚本来启动 Equinox,并指定要加载的bundle。 学习和掌握Equinox,不仅可以帮助你理解模块化开发的优势...

    c语言入门简单介绍教程

    作为一门基础的编程语言,C语言入门是每一位想要学习编程的初学者必须经历的阶段。本教程将为你提供一个全面且深入的C语言基础知识框架。 首先,我们要了解C语言的基本结构。C语言的源代码由一个个函数组成,每个...

    Scientific Computing: An Introduction

    本书作为《计算科学与工程文集》系列之一,共有11个章节,内容覆盖了科学计算的基础理论和实践应用。每个章节都精心设计了案例和练习,帮助读者逐步掌握科学计算的核心概念和技术。 - **基础部分**:包括数值分析的...

Global site tag (gtag.js) - Google Analytics