首先,我假设你已经了解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环境。

Felix入门与实践(一)相关推荐

  1. 计算机编程书籍-Python硬件开发树莓派从入门到实践无人驾驶 AndroidTV 自动循迹

    内容简介 <Python硬件开发树莓派从入门到实践>全书可大致分为4个部分,其中第13章介绍了树莓派的基本使用:第4章介绍了如何在树莓派上使用Python的OpenCV包:第58章介绍了树 ...

  2. 免费送书啦!《 OpenCV图像处理入门与实践》一本全搞定

    OpenCV 的基础图像操作都只是针对图像中的像素点,并不是直接对图像整体进行的操作.而很多时候并不能仅通过改变像素点来进行图像的操作,为此我们需要学习关于图像的算术操作. 1.图像加法 对于两张相同 ...

  3. python快速编程入门课后简答题答案-Python编程:从入门到实践(第2版)第1章习题答案...

    <Python编程:从入门到实践>是一本不错的书.第2版已经公开预售,预计会在10月份正式上市. 动手试一试 本章的练习都是探索性的,但从第2章开始将要求你用那一章学到的知识来解决问题. ...

  4. python入门到实践-一本书搞定Python入门到实践

    上周介绍了几本Python从入门到进阶书籍,今天继续推荐好书,这本书是<Python编程:从入门到实践>.入门 Python 最好的书之一,适合零基础小白,也适合有其它语言背景的程序员 书 ...

  5. python如何导入txt数据集-终于找到python入门到实践数据集

    Python是一款功能强大的脚本语言,具有丰富和强大的库,重要的是,它还具有很强的可读性,易用易学,非常适合编程初学者入门.以下是小编为你整理的python入门到实践数据集 环境配置:下载Python ...

  6. python编程 从入门到实践怎么样-python编程从入门到实践这本书怎么样

    <Python编程-从入门到实践>作者: Eric Matthes,已翻译为中文,人民邮电出版社出版. python编程从入门到实践怎么样? 我们一起看看已经学习的同学对这本书的口碑和评价 ...

  7. python编程入门到实践 百度云-python网络爬虫从入门到实践pdf

    python网络爬虫从入门到实践pdf是一本非常热门的编程教学.这本书籍详细讲解了Python以及网络爬虫相关知识,非常适合新手阅读,需要的用户自行下载吧. Python网络爬虫从入门到实践电子书介绍 ...

  8. python编程入门指南怎么样-python编程从入门到实践这本书怎么样

    <Python编程-从入门到实践>作者: Eric Matthes,已翻译为中文,人民邮电出版社出版. python编程从入门到实践怎么样? 我们一起看看已经学习的同学对这本书的口碑和评价 ...

  9. python小项目实例流程-《Python编程:从入门到实践》DEMO实例代码

    这篇文章主要知识点是关于Python编程,从入门到实践,DEMO,,的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书 前言 之前,项目后台基本都是使用 Java 的 SpringBo ...

  10. python网络爬虫教程-终于明了python网络爬虫从入门到实践

    Python是一款功能强大的脚本语言,具有丰富和强大的库,重要的是,它还具有很强的可读性,易用易学,非常适合编程初学者入门.以下是小编为你整理的python网络爬虫从入门到实践 环境配置:下载Pyth ...

最新文章

  1. Ubuntu 系统开机黑屏提示the root filesystem on /dev/sdb2 requires a manual fsck
  2. name 'false' is not defined
  3. 网页中层或菜单被Flash挡住的解决办法
  4. H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式
  5. 《CCNA无线640-722认证考试指南》——5.4节其他无线拓扑
  6. Maven分布式工程-分页查询(一)
  7. 转载:SQL入门教程
  8. 如何破解加密的PDF文件
  9. 推荐系统(十六)多任务学习:腾讯PLE模型(Progressive Layered Extraction model)
  10. 计算机屏幕黑屏让程序继续允许,电脑软件让对方黑屏
  11. 【IDEA】idea取消英语拼音提示绿色波浪线
  12. python中转义字符用法及例子,python的转义字符及用法代码解析
  13. 怎么给input插入一个图片
  14. 英语语法三大从句刷题总结
  15. 如何有效激励员工,提高积极性
  16. 微信应用域名所有权验证管理
  17. javaweb超市管理系统--用户管理
  18. HTML5期末大作业:基于html+css+javascript+jquery实现藏族文化15页【学生网页设计作业源码】
  19. 29.顺时针打印矩阵
  20. 【体验系列】云IDE使用初体验

热门文章

  1. BP神经网络的简单应用
  2. Linux网络适配器不见了,linux – lspci未显示HyperV网络适配器
  3. 迅捷路由虚拟服务器设置,迅捷 FWR310 无线路由器端口映射设置指南
  4. vue生命周期 阿星小栈
  5. 【数据库】数据、数据库、数据库管理系统、数据库系统
  6. 网页上为何出现连接超时,怎么解决呢?
  7. Photoshop怎样快速调整画笔大小
  8. codevs 1138
  9. python 开发微信小游戏_教你快速开发一个微信小游戏好友排行榜
  10. python---合并两个excel表格内容