OSGi介绍(四)第一个bundle

开发第一个OpenDaylight中的OSGI bundle http://www.frank-durr.de/?p=84 学弟推荐的一个非常详细的opendaylight开发入门教程,这里尽力翻译一下,为了自己更好的理解。     在这个教程里,我会详细解释如何为opendaylight开发一个OSGI组件来实现常规的网络控制逻辑。与REST 借口不同,当一个packe到达并t在交换设备流表中失配的时候,将会触发一个packetin事件,OSG 阅读详情

先给出“扶贫助手”的第一种改造,我称之为“直接型”,请看:

package  aa.bb.cc;
// 需要import osgi的核心package
import  org.osgi.framework.BundleActivator;
import  org.osgi.framework.BundleContext;
// 实现了BundleActivator
public   class  FamilyInfo  implements  BundleActivator  {
 private String familyName;
 private int population;
 private int incomePerYear;
 省略了getter和setter方法 
 public String toString() {
  
  return "Family: " + this.familyName + ", population: " + this.population + ", income: " + this.incomePerYear;
 }

 
 public int getIncomePerMember(){
  return (int)(this.incomePerYear/this.population);
 }

 public static void sortByIncomePerYear(FamilyInfo[] families){
  FamilyInfo temp = null;
  for(int i = 0; i < families.length -1; i ++){
   for(int j = i + 1; j < families.length; j ++){
    
    if(families[i].getIncomePerYear() > families[j].getIncomePerYear()){
     temp = families[i];
     families[i] = families[j];
     families[j] = temp;
    }

   }

  }

  
 }

 public static void sortByIncomePerMember(FamilyInfo[] families){
  FamilyInfo temp = null;
  for(int i = 0; i < families.length -1; i ++){
   for(int j = i + 1; j < families.length; j ++){
    
    if(families[i].getIncomePerMember() > families[j].getIncomePerMember()){
     temp = families[i];
     families[i] = families[j];
     families[j] = temp;
    }

   }

  }

  
  
 }

 //在framework每次启动该bundle的时候该方法会被framework调用执行。
 public void start(BundleContext context) throws Exception {
  FamilyInfo[] families = new FamilyInfo[3];
  families[0] = new FamilyInfo();
  families[0].setFamilyName("Zhang");
  families[0].setPopulation(3);
  families[0].setIncomePerYear(1200);
  families[1] = new FamilyInfo();
  families[1].setFamilyName("Li");
  families[1].setPopulation(6);
  families[1].setIncomePerYear(1800);
  families[2] = new FamilyInfo();
  families[2].setFamilyName("Liu");
  families[2].setPopulation(4);
  families[2].setIncomePerYear(1500);
  FamilyInfo.sortByIncomePerYear(families);
  for(int i = 0; i < families.length; i ++){
   System.out.println(families[i].toString());
  }

  FamilyInfo.sortByIncomePerMember(families);
  for(int i = 0; i < families.length; i ++){
   System.out.println(families[i].toString());
  }

 }

 //在framework停止该bundle时,该方法将被framework调用
 public void stop(BundleContext context) throws Exception {
 }

}


看到代码的区别了吗?我在不同之处都标注了注释。其实,从说白了,就是实现了org.osgi.framework.BundleActivator这个接口。
当然,细心的话,你会发现这个bundle没有public static void main(String[] args)方法了。那么它怎么被启动呢?这个就是bundle的奥秘所在。不过,如果你了解java的class loading机制以及reflection技术,你立马会明白这个bundle的运行机制。这两项技术广泛应用于j2ee(对吧?我得承认,j2ee的经验不多,呵呵)以及java的plugin机制。
简单说来,java.lang.Class这个类有一个方法:
public Object newInstance()throws InstantiationException,IllegalAccessException
针对上面的“扶贫助手”bundle而言,framework只要通过ClassLoader找到aa.bb.cc.FamilyInfo.class并加载后,就可以通过newInstance()方法创建一个BundleActivator的实例,然后调用public void start(BundleContext context)方法,就完成了启动bundle的动作了。之后,调用public
void stop(BundleContext context)方法来停止bundle
如果你接着问,framework怎么知道这个bundle里面的BundleActivator是哪个类呢?嗯,问到点子上了。这就涉及到下面我们要讲的bundle的部署了。在上一篇给出的bundle定义中指出,Jar文件是bundle的唯一格式,也就是说,我们要运行bundle,必须把代码打成jar文件。而jar文件可以带有manifest文件,这个文件对bundle是不可缺少的。OSGi规范里面,通过定义一系列适用于bundle的manifest关键字(bundle manifest header)来扩展manifest文件。
比如,开发人员在manifest中添加下面一行:
Bundle-Activator: aa.bb.cc.FamilyInfo
这样,在bundle被部署到framework后,framework就可以通过读取manifest的关键字来获得BundleActivator的具体实现类名,并通过reflection机制产生BundleActivator的实例。
这里就给出扶贫助手的manifest的一个例子:

Manifest-Version:  1.0   
Bundle-SymbolicName: aa.bb.cc.family //osgi specification 4强制要求的关键字,每个bundle都必须有唯一的symbolic name
Bundle-Name: Family Info Manager        //bundle的名称
Bundle-Version:  1.0    //bundle的版本号
Bundle-Activator: aa.bb.cc.FamilyInfo   //指明BundleActivator的实现类名
Import-Package: org.osgi.framework ; version=1.3   //列出该bundle需要从其他bundle所引入的
                                                                     //package(s)(提供该package的bundle必须在其
                                                                     //manifest中有Export-Package: 
                                                                     //org.osgi.framework ; version=1.3)

然后我们用jdk自带的jar工具,来生成bundle jar文件。这样,第一个bundle就完成了,您可以下载一个开源的framework安装这个bundle试一试。在framework上尝试对该bundle的启动和停止,输出的结果应该和原先的java application是一样的,然后您还可以在那个start(context)的方法中,再增加一条记录,重新打包,然后通过framework的update功能,就能够在不重新启动framework的情况下升级该bundle,我就暂时偷懒不针对具体framework来给出操作的方法了,先给您自己先摸索了(当然您也可以偷懒,因为后面我会结合具体framework深入讲述的)。
好了,说完代码的改造,再看看改造所带来的程序设计结构变化:那~~~就~~~~是~~~~没变化!因此我把这种原封不动的改造方法称为“直接型”,用这种直接法,我们可以轻易的把一个java应用程序改造成bundle。而这种改造目前能看到的好处就是bundle的“热”升级。那怎样能更漂亮些呢?在下一篇中,我会进一步改造这个扶贫助手成为两个bundle,看看bundle的合作将会带来怎样的精彩效果

org.osgi.framework.BundleException-glassfish NULL 博文链接:https://cobble19.iteye.com/blog/1010849 立即下载

相关推荐

USB3.0一致性测试方案

为各测试项目具体测试结果包括脉冲串突发时间、脉冲串重复时间、时钟周期以及眼图等完整USB3.0测试项目,工程师可以看到各项测试的具体结果方便观察。RIGOL 提供了一套完善的工具,包括数字示波器、专业的测试夹具以及全自动一致性测试软件,使得USB 3.0设备设计人员能够高效精确地进行信号捕捉、测试与分析。报告第二部分测试摘要,在此可以看到USB3.0测试所有测试项目,并且可以观看到测试是否正常,可以帮助工程师更好的判断测试结果。,以简化下载、存储以及对于多媒体的大量内容的共享。

2409_87378937的博客 2527

用Java的OSGi框架构建灵活模块化应用

OSGi是一种面向服务的模块化框架它将应用程序划分为多个独立的、可重用的模块每个模块被称为一个bundle每个bundle都有自己的生命周期、类加载器和依赖管理机制OSGi框架提供了动态部署、服务导向、类加载隔离和生命周期管理等关键特性使得应用程序更具灵活性和可维护性。

编程思维 692

从CT扫描到3D模型:手把手教你用NII文件在3D Slicer中重建脊柱(附Verse数据集实战)

本文详细介绍了如何利用NII文件在3D Slicer中从CT扫描数据重建脊柱3D模型的全流程,包括环境配置、数据获取、方向校准、结构分割和模型优化等关键步骤。通过Verse数据集实战演示,帮助医学从业者快速掌握医学图像处理技术,提升临床诊疗与教学效率。

weixin_42651281的博客 202

常用的OSGI包

前面三节讲了osgi实用的一些例子,可以给个大概的印象,第四节讲了osgi一些基础知识,更加深刻具体了解osgi, 这一节讲常用的osgi包。在这里也分享一下osgi的一些学习历程: 1. 学习osgi入门概念,推荐:不可错过的OSGi入门学习资源 2. 下载apache-felix,选择一个镜像并下载其中的apache-felix-karaf-1.6.0.zip 3. 过一遍apache

牛仔的blog 3614

【Godot4自学手册】第一节配置Godot运行环境

Godot是一款自由开源、由社区驱动的 2D 和 3D 游戏引擎!它是一款功能丰富的跨平台游戏引擎,可以通过统一的界面创建 2D 和 3D 游戏。它提供了一套全面的通用工具,因此用户可以专注于制作游戏,而无需重新发明轮子。游戏可以一键导出到多个平台,包括主流的桌面平台(Linux、macOS、Windows)、移动平台(Android、iOS)、基于 Web 的平台以及主机平台。

zhaoyang314的博客 5981

无人机视角下基于YOLOv5/v8/v10的车辆检测系统:从算法原理到UI界面实战

随着无人机技术的普及和智慧城市的发展,无人机视角下的车辆检测在交通监控、战场侦察、灾害救援等领域展现出巨大的应用价值。然而,无人机航拍图像存在目标尺度小、视角多变、背景复杂等挑战。本文深入探讨了如何利用YOLOv5、YOLOv8、YOLOv10三个代表性目标检测算法,构建一套完整的无人机车辆检测系统。文章不仅详细解析了各版本YOLO的核心技术演进,还提供了从数据集准备、模型训练、性能评估到基于PyQt5/PySide6的图形界面开发的完整代码实现。通过本文,读者将能够掌握构建无人机实时车辆检测系统的全流程技

YOLO 172

基于OSGI开发一个简单的budnle

目的:尝试开发一个Hello World bundle ,并与KNIME的bundle实现通信,可以注册到KNIME的OSGi中。 启动Eclipse,依次点 File --> New --> Project。选择Plug-in Project–>next。如图1 图一 输入Project Name项目名称,比如com.howard.sample.HelloWorld,Target Platform(目标平台)里的an OSGI framework,选择standard。剩下的保持默.

weixin_43857576的博客 395

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

java.lang.NoClassDefFoundError: org/osgi/framework/BundleActivator

Felix中添加bundle报错:java.lang.NoClassDefFoundError: org/osgi/framework/BundleActivator

weixin_56826227的博客 618

Ardupilot飞控姿态角与姿态角速度控制过程分析(超长篇)

目录 目录 摘要 1.代码控制过程分析 摘要 本节主要记录自己学习ardupilot飞控代码的姿态角速度的控制过程 1.代码控制过程分析 可以看出:AC_AttitudeControl *attitude_control; //指针对象 virtual void rate_controller_run() = 0;是AC_AttitudeContro...

陌城烟雨 1万+

[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

分类(Classification)属于有监督学习(Supervised Learning)中的一类,它是数据挖掘、机器学习和数据科学中一个重要的研究领域。分类模型类似于人类学习的方式,通过对历史数据或训练集的学习得到一个目标函数,再用该目标函数预测新数据集的未知属性。本章主要讲述分类算法基础概念,并结合决策树、KNN、SVM分类算法案例分析各类数据集,从而让读者学会使用Python分类算法分析自己的数据集,研究自己领域的知识,从而创造价值。 19.1 分类 19.1.1 分类模型 与前面讲述的聚类模型类似

杨秀璋的专栏 2万+

Maven构建OSGI+HttpServer应用

使用 "org.eclipse.equinox.http" 包(例如:http-1.0.100-v20070423.jar),可以将我们自定义的服务(servlet或静态资源页面)注册到这个 HttpService 中去,实现自定义的HTTP服务。一种是基于”org.eclipse.equinox.http”包的轻量级实现,另一种是基于”org.eclipse.equinox.http.jetty”包(基于jetty的Servlet)实现。3)创建静态页面文件:webpage/index.html。

sunny05296的博客 1933

Qt | 开发过程中总结的经验

关于如何判断自己的Qt库是多少位,有个误区就是很多人要么看成了QtCreator的关于信息中列出的位数,要么以为自己是64位的系统就认为是64位的Qt,最终要在Qt构建套件中查看具体位数,大概从Qt5.14开始基本上很少提供32位的库,尤其是Qt6.0以后基本上默认就是只有64位的库了,这也是顺应时代潮流,毕竟不久的将来(个人预计2030年以前)基本上32位的系统占比不超过1%,放心大胆的用64位的库吧,抛弃烦人的32位以及XP系统。Qt常用类的头文件的函数看完学完使用一遍并加以融会贯通,月薪30K起步。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 488

OSGi起步(1):第一个Bundle

最近决定尝试翻译一些简单的文章。---------------------------------原文出处:http://www.eclipsezone.com/eclipse/forums/t90365.html原作者:Neil BartlettBlog http://neilbartlett.name/blog/osgi-articles/-----------------

瓶子的窝 1778

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

OSGI BUNDLE

<br />开发一个简单的Hello World的OSGi Bundle(OSGi绑定包)<br />在OSGi中,软件是以Bundle的形式发布的。一个Bundle由Java类和其它资源构成,它可为其它的Bundle提供服务,也可以导入其 它Bundle中的Java包;同时,OSGi的Bundle也可以为其所在的设备提供一些功能。Eclipse为开发OSGiBundle提供了优秀的 支持,它不仅提供了向导来创建OSGi Bundle,而且还提供了内嵌的Equinox容器,您可以使用该容器执行和调试

码龙008 1113

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

在Eclipse中开发OSGi Bundle

Eclipse为开发OSGI Bundle提供了良好的支持,它不仅提供向导来创建OSGi Bundle,而且还提供了内嵌的OSGi框架实现(即Equinox容器),可以使用该容器执行和调试Bundle。从本质上说,每一个Eclipse插件都是一个OSGi Bundle,只不过这个OSGi Bundle增加了一些Eclipse专用的代码而已。下面通过具体的例子来介绍如何用Eclipse来开发OSGi...

程序员的天堂 742

利用 Eclipse 开发基于 OSGi 的 Bundle 应用[摘]

开放服务网关协议 (Open Services Gateway Initiative),简称 OSGi,为网络服务定义了一个标准的、面向服务的计算环境,为用户提供了开放的、面向服务组件的、易于部署的编程模型,这个编程模型允许用户将定义好的接口规范绑定到 OSGi 运行环境中的特定Service,在构件 SOA 面向服务为中心的企业应用的过程中,OSGi 技术正发挥越来越重要的作用。在本文中,将介绍

SQ 1033

将普通jar文件打包成osgi bundle的方法

  最近更新列表 1.IBM的aix中安装jdk(7月21更新)2.Linux(CentOS)中安装jdk (7月21更新)3.Linux(CentOS)安装weblogic (7月22更新)4.Aix系统中安装webLogic (7月22更新)5.IBM实体机aix中创建weblogic域 (7月23更新)6.linux中通过VNC创建weblogic域 (7月23更新)7.在RedHa...

zl19861225的专栏 1147

OSGi介绍及OSGi的Bundle应用

http://blog.sina.com.cn/s/blog_50356fbb0100dytp.html 关键字: OSGi Bundle Plugin Eclipse     开放服务网关协议 (Open Services Gateway Initiative),简称 OSGi,为网络服务定义了一个标准的、面向服务的计算环境,为用户提供了开放的、面向服务组件的、易于部署的编程模型,这个编

走马观花 1762

eclipse编写第一个osgi bundle的小demo,同时导出osgi化的bundle

最近搞得项目用到了osgi,之前完全没听说过,在网上查了下貌似也是很老的技术,使用范围不是很广的样子,但是既然用到了就要学习一下嘛,先写个简单的小demo,查阅了几个博客,按照正常情况下执行总是报错,后来经过一番研究,终于解决了报错问题,现记录如下。1 .首先new-other,选择创建plug-in Project,见下图 2 .点击next,选择osgi framework,指定配置为标准,具

梦岚如雪 4363

一种获取OSGi任意Bundle的ClassLoader的方法

在OSGi环境中,在Bundle内部代码中要得到自己Bundle的ClassLoader就很简单,在自己Bundle的代码中,直接写this.getClass().getClassLoader()就得到了自己Bundle的ClassLoader了。但怎么在其他Bundle或外部代码中得到任意一个Bundle的ClassLoader呢?Bundle和BundleContext都没有提供ge...

dingqiue1982的博客 318

OSGi 体系结构及Bundle简介

<br /><br />1、OSGi 的体系架构是基于插件式的软件结构,包括一个 OSGi 框架和一系列插件,在 OSGi中,插件称为 Bundle,其中,OSGi 框架规范是 OSGi 规范的核心部分,它提供了一个通用的、安全可管理的 Java 框架,通过这个框架,可以支持 Bundle 服务应用的部署和扩展。Bundle 之间可以通过 Import Package 和 Require-Bundle 来共享 Java 类,在 OSGi 服务平台中,用户通过开发 Bundle 来提供需要的功能,这些 Bun

immcss的专栏 1114

在osgi bundle中访问osgi container之外的传统服务

      osgi container是java实践中的一个框架,在这个框架中,按照osgi的规范,实现了java中module的思想,从而真正实现了java的模块化开发。       在模块的互用方面,osgi提供了两种方式:一是通过export/import包实现,二是通过在osgi bundlecontext中注册service,实现各个模块之间的交互。第二种方式符合SOA的标准,是os...

沧海一粟 187

OSGI-OSGI体系架构以及Bundle管理

OSGI:             OSGI的体系架构是基于插件式的软件结构,包括一个 OSGI 框架和一系列插件,在 OSGI中,插件称为 Bundle,其中,OSGI框架规范是OSGI规范的核心部分,它提供了一个通用的、安全可管理的 Java 框架,通过这个框架,可以支持 Bundle 服务应用的部署和扩展。Bundle 之间可以通过 Import Package 和 Require-B...

南窑头村长 505

OSGI bundle 生命周期

OSGI bundle共有六个生命周期: INSTALLED (安装期) RESOLVED (解析期) STARTING (启动期) ACTIVE(活跃期) STOPPING(停止期) UNINSTALLED (卸载期) 关系图: OSGI命令: 命令 用途 使用方法 ss ...

ErikChan的博客 383
上一篇: OSGi介绍(三)OSGi service platform的体系结构
下一篇: OSGi介绍(五)两个bundle
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值