OSGI基础知识整理
一、 简介:
OSGi(Open Service Gateway Initiative)技术是面向Java的动态模型系统。
OSGi的主要职责就是为了让开发者能够创建动态化、模块化的Java系统。
OSGi 的模块化,是通过为 Jar 包添加元数据(metadata)来定义哪些类该暴露,哪些类该隐藏,其控制单元叫做 Bundle(jar 包)。;
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框架从概念上可以分为三层:模块层、生命周期层和服务层:
- Module Layer(模块层):模块层主要涉及包及共享的代码;
- Lifecycle Layer(生命周期层):生命周期层主要涉及Bundle的运行时生命周期管理;
- 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基础知识整理的更多相关文章
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- 【OGG】OGG基础知识整理
[OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...
- java部分基础知识整理----百度脑图版
近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...
- wifi基础知识整理
转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...
- JavaScript基础知识整理
只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...
- C#基础知识整理
年时,北风吹雁雪纷纷,一条秋裤冻上头.冷的连手都懒得动,就随便翻翻书,也没有更新博客,如今年已过,开始投入到正常的工作状态中,趁现在需求还没有来,把C#基础知识梳理一下,其实一直以来就想这样做的,对于 ...
- Oracle ASM 磁盘组基础知识整理(收藏版)
转至:https://cloud.tencent.com/developer/article/1494403 为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的 ...
- Linux基础知识整理
一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ...
随机推荐
- Linux:NFS配置
NFS配置 1.创建分享的文件:touch /var/www/html/aa.txt2.查看是否安装NFS:rpm -qa|grep nfs3.查看IP地址:ifconfig4.配置NFS:vi /e ...
- [python]操作redis sentinel以及cluster
先了解清楚sentinel和cluster的差别,再学习使用python操作redis的API,感觉会更加清晰明白. 1.redis sentinel和cluster的区别 sentinel遵循主从结 ...
- [Jedis] ERR wrong number of arguments for 'mget'
看别人写的代码是件比较痛苦的事情,更加痛苦的是别人的代码出错还要负责调试好. 关于如何迅速定位问题和调试代码,我的一点感受是:逐行认真查看错误信息,在这些信息中找自己熟悉的内容(包括文件名.方法名等) ...
- JAVA_全局配置文件(配置网址,url等等)_第二种方式
@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中 1.application-local.yml 配置文件 2.Service 3. ...
- linux 编译链接问题
-rpath和-rpath-link 假设有3个文件,在同一目录下,有这样的依赖关系 test->liba.so->libd.so 如果编译test的时候这样写 gcc test.c –l ...
- ECONOMETRICS CHAPTER1
♣回归一词的来历 回归到中等,子辈较父辈的身高回归到中等. ♣回归的现代含义 研究一个因变量对解释变量的依赖关系.通过解释变量来估计和预测因变量. ♣回归分析的结果不一定意味着因果关系,必须诉诸理论思 ...
- SpringBoot 配置文件详解
springboot采纳了建立生产就绪spring应用程序的观点. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.在一般情况下,我们不需要做太多的配置就能够让spring boot正 ...
- 二叉树求逆序对(伪AC 23333)
成链的时候 是最坏情况 O(n^2)的复杂度呢! 按照输入的数据 一个一个的插入建树 然后维护左右儿子的个数 (我们规定, 左儿子 小于 父亲 右儿子大于父亲) 往左走 说明存在逆序对 逆序对的 ...
- 将数据存入mysql中
import pymysql import warnings # 忽略警告 warnings.filterwarnings("ignore") # 连接数据库 db = pymys ...
- [LeetCode&Python] Problem 1: Two Sum
Problem Description: Given an array of integers, return indices of the two numbers such that they ad ...