一、             简介:

OSGi(Open Service Gateway Initiative)技术是面向Java的动态模型系统。

OSGi的主要职责就是为了让开发者能够创建动态化、模块化的Java系统。

OSGi 的模块化,是通过为 Jar 包添加元数据(metadata)来定义哪些类该暴露,哪些类该隐藏,其控制单元叫做 Bundlejar 包)。;

bundle 是以 jar 包形式存在的一个模块化物理单元,里面包含了代码,资源文件和元数据(Manifest.mf文件保存模块的元数据信息),并且jar包的物理边界也同时是运行时逻辑模块的封装边界。

二、             常用基本命令:

命令

备注

install

将bundle安装到框架中

uninstall

bundle卸载

start

启动一个bundle

stop

停止一个bundle

refresh

刷新bundle

update

更新bundle 的内容

ss

简单显示所有bundle的状态

status

展示安装的bundle和注册的服务

headers

展示bundle 的manifest中的元数据

三、             三层架构:

OSGi框架从概念上可以分为三层:模块层、生命周期层和服务层:

  1. Module Layer(模块层):模块层主要涉及包及共享的代码;
  2. Lifecycle Layer(生命周期层):生命周期层主要涉及Bundle的运行时生命周期管理;
  3. Service Layer(服务层):服务层主要涉及模块之间的交互和通信。

1.      模块层:

模块层定义了OSGi模块的概念,模块即bundle,即包含一个元数据MANIFEST.MF的JAR文件,bundle比标准JAR文件更强大,它可以声明哪些包对外可见(Export-Package);所以说它扩展了Java的访问修饰符。

bundle还可以明确声明依赖哪些外部包(Import-Package);

1)     MANIFEST.MF文件的格式:

属性声明的一般格式是name: value;

在eclipse下可以手工编写这个文件,也可以通过可视化编辑工具进行编辑,可视化编辑和文件内容是同步;

2)     OSGI定义信息:

标识名

备注

Bundle信息

Manifest-Version

Manifest文件的版本号

Bundle-ManifestVersion

jar包应遵循的OSGI的版本号,目前都固定为2

Bundle-Version

OSGI插件(Bundle)的版本号

Bundle-Name

插件名称

Bundle-SymbolicName

插件标识名称,在系统中唯一标识名称,后面可带上singleton标识,如果singleton标识为True则表示单例;

Bundle-RequiredExecutionEnvironment

运行此插件所需的执行环境及版本号(比如JavaSE-1.7)

Bundle-Activator

Bundle启动器实现类

可见性标识

Import-Package

用于声明Bundle需要导入哪些Package

Require-Bundle

定义依赖的 Bundle

Bundle-Classpath

描述了Bundle加载器的Classpath范围,即Bundle加载器应该到哪里去查找类(比如Bundle-ClassPath: .,即Bundle跟目录下的所有包)

Export-Package

声明Bundle要导出哪些Package

3)     Import-Package 与 Require-Bundle的区别:

Import-Package 与 Require-Bundle很相似,都是定义了导入包依赖的方式;

从图中可以看出Require-Bundle 会对整个 Bundle 产生依赖,也就是说 Bundle 所 Export 出的包都会被 A 加入到自己的类空间,而 Import-Package 只会对指定的包产生依赖关系。

在大多数情况下,都应该使用 Import-Package 而不是 Require-Bundle 。 Import-Package 比 Require-Bundle 更利于 Bundle 的部署和版本维护,同时在查找类的时候有更高的效率。

2.      生命周期层:

1)  生命周期层的主要功能是控制动态安装、开启、关闭、更新和卸载的bundles。

2)   生命周期层关注于提供执行时模块管理、和对底层OSGi框架的访问。

3)   在标准的Java编程中,可以通过将jar包放到classpath中来使用它。而bundle则不是这样,Bundle只有在被安装和启动(install/Start)后才能用起来。并且OSGi框架支持对这些bundle完整的生命周期管理,并且支持这些管理操作在应用执行完成。

服务接口:

序号

服务名

说明

1

BundleActivator

捕捉bundle的start和stop事件,并对这两个事件作出自定义的反应。

2

BundleContext

一个bundle在框架中的执行时上下文,这个上下文提供了和框架进行交互的方法。

3

Bundle

在逻辑上表示了一个bundle,OSGi环境中的一个物理bundle对应了一个bundle对象。该对象中包含了bundle的基本信息和bundle生命周期的控制接口。

启动Bundle的两种方式:

1)   BundleActivator启动;

2)   OSGI-INF下的xml文件中指定activate和deactivate方法;

3.      服务层:

服务层关注于模块,特别是模块内的组件间的交互和通信。

服务提供者将服务发布到服务注册中心,服务客户端搜索服务注册中心,查找可供使用的服务。

1)     注册和检索服务:

2)     OSGI中提供的注册和检索服务:

MessageManager manager = ServiceLookupUtil.lookupService(MessageManager.class);

OSGI基础知识整理的更多相关文章

  1. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  2. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  3. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

  4. java部分基础知识整理----百度脑图版

    近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...

  5. wifi基础知识整理

    转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...

  6. JavaScript基础知识整理

    只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...

  7. C#基础知识整理

    年时,北风吹雁雪纷纷,一条秋裤冻上头.冷的连手都懒得动,就随便翻翻书,也没有更新博客,如今年已过,开始投入到正常的工作状态中,趁现在需求还没有来,把C#基础知识梳理一下,其实一直以来就想这样做的,对于 ...

  8. Oracle ASM 磁盘组基础知识整理(收藏版)

    转至:https://cloud.tencent.com/developer/article/1494403 为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的 ...

  9. Linux基础知识整理

    一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ...

随机推荐

  1. 火狐下,td 的 bug;

    想实现类似的效果,看代码, <div style="width:488px;float:left; margin:-52px 0px 15px 15px;"> < ...

  2. Oracle包和包体

    一.什么要使用包? 在一个大型项目中,可能有很多模块,而每个模块又有自己的过程.函数等.而这些过程.函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起 的,即Procedures中),这些 ...

  3. python点滴:读取和整合文件夹下的所有文件

    当我们想读取一个文件夹下的多个文件,并且将所有文件的内容整合成一个文件,应该怎么做? 基本的思路是:写一个专门的函数实现以上两个功能.主要用到的命令包括os.listdir().codecs.open ...

  4. 爬虫系列5:scrapy动态页面爬取的另一种思路

    前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...

  5. Vue - iview 开发经验

    Q:打包之后,iview表格宽度异常,过宽或者没有宽度 A:由于columns内某一项width设置为‘百分比(20%)’或者‘100px’导致的, columns内项目的width必须为number ...

  6. 2016 多校联赛7 Joint Stacks (优先队列)

    A stack is a data structure in which all insertions and deletions of entries are made at one end, ca ...

  7. 【Python】多进程-4

    #练习:用event事件控制进程执行顺序,下面例子中,主进程main函数在创建了子进程之后,依然会往下执行,所以会出现主进程先打印出来的情况 import multiprocessing import ...

  8. printf 汇总

    //u32为unsigned long u32 g_u32FiveSecondCount = 0; mysprintf(TempBuf, "\r\n%ld Uart console.&quo ...

  9. logminer使用测试库进行挖掘分析,10.2.0.5

    上一篇测试是在dg环境进行测试挖掘,但是如果客户存在一个测试库,那样使用日志挖掘的影响性更小.本篇进行测试分析. 测试环境介绍: oracle linux  5.6,vmware虚拟机,安装两套单实例 ...

  10. multi-thread debug

    1.不要去解锁一个未被加锁的mutex锁: 2.不要一个线程中加锁而在另一个线程中解锁: 3.使用mutex锁用于保护临界资源,严格按照“加锁-->写入/读取临界资源-->解锁”的流程执行 ...