首先,我假设你已经了解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,全称为 Open Service Gateway Initiative,从字面上理解,它最初被设计为一个面向服务的平台。1999 年,OSGi 联盟成立,旨在为通过网络向设备提供服务建立开放的...
这本书为想要入门OSGi和Apache Felix的开发人员提供了一个详细的学习路径,涵盖了基础知识到实践应用的各个环节。学习完这本书之后,开发人员将能够使用Felix框架构建自己的模块化应用程序,并理解OSGi技术如何在...
本书是国内第一本关于OSGI的书籍,旨在为广大开发人员提供一个关于OSGI从入门到深入的完成资料。通过大家熟悉的petstore的例子让大家能够更好地了解基于OSGi实现的模块化,动态化的JAVA系统。
是一本适合新接触OSGI开发学习的一本很好的书,本书介绍了Equinox, Spring-DM和Felix这三个常用的OSGi容器的使用、开发、以及WebApplication的开发部署;介绍了OSGi的规范和Core Framework和Layer。包含书中的用例源...
本书基于作者多年使用OSGi的经验而编写,涵盖了...最后对OSGi知识进行深入讲解,通过对OSGi规范和实现框架(Equinox、Felix、Spring-DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi。
OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础的架构。OSGi容器已经有多家开源的实现,比如:knoflerfish、Equnox、Apache的Felix。你可以通过这些容器,把你的应用程序划分为多个模块单元...
多年使用0SGi的经验而编写,涵盖了0SGi从入门到深入的...最后对0SGi知识进行深入讲解,通过对0SGi规范和实现框架(Equinox、Felix、Spring—DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi
5. **felix或equinox等OSGI实现**:熟悉至少一种OSGI容器,比如Apache Felix或Eclipse Equinox,它们提供了运行OSGI应用的平台。 通过分析这两个示例源码,你可以深入理解OSGI的工作原理,包括bundle间如何交互、...
在OSGI入门阶段,首先要理解的是它的基本概念,如bundle(模块)、服务、生命周期管理和依赖管理。Bundle是OSGI中的核心组件,它类似于Java的JAR文件,但具有自己的元数据和生命周期。每个bundle可以导出和导入服务...
1. **环境搭建**:首先需要安装一个支持OSGi的运行时环境,如Apache Felix或Equinox,然后配置Spring OSGi容器,如Spring DM(现在已改名为SpringSource dm Server)。 2. **编写bundle**:创建Spring配置文件,定义...
4. **felix或equinox**:Felix和Equinox是两个常用的OSGi运行时实现,它们提供了API和框架,用于构建和运行OSGi应用。 5. **Blueprint或Declarative Services**:这两种是OSGi中的服务配置方式,Blueprint更接近XML...
作者通过一个实际的例子来帮助读者理解如何使用OSGi,使初学者能够快速入门。 **标签:“源码”,“工具”** **正文:** OSGi是一种Java模块化系统,它为Java应用程序提供了一个动态的运行时环境。在Java世界中,...
- **环境准备**:安装一个 OSGi 容器,如 Apache Felix 或 Equinox,这些都是 Spring OSGi 支持的容器。 - **创建 bundle**:将 Spring 应用打包为 OSGi bundle,确保所有依赖都被包含并正确配置版本。 - **配置 ...
7. **运行时环境**:为了运行Equinox应用,你需要一个OSGi运行时,如Equinox本身或Felix。你可以通过命令行或脚本来启动 Equinox,并指定要加载的bundle。 学习和掌握Equinox,不仅可以帮助你理解模块化开发的优势...
作为一门基础的编程语言,C语言入门是每一位想要学习编程的初学者必须经历的阶段。本教程将为你提供一个全面且深入的C语言基础知识框架。 首先,我们要了解C语言的基本结构。C语言的源代码由一个个函数组成,每个...
本书作为《计算科学与工程文集》系列之一,共有11个章节,内容覆盖了科学计算的基础理论和实践应用。每个章节都精心设计了案例和练习,帮助读者逐步掌握科学计算的核心概念和技术。 - **基础部分**:包括数值分析的...