下面主要摘自IBM官方文档
https://www.ibm.com/developerworks/cn/education/opensource/os-eclipse-osgi/index.html

OSGi基础

OSGi的核心就在与类的加载和隔离。

bundle 中的类是如何查找的:

  • 首先,它会找 JRE,这个很明显,这个实际是通过系统环境的 JAVA_HOME 中找到的,路径一般是 JAVA_HOME/lib/rt.jar、tools.jar 和 ext 目录,endorsed 目录。
  • 其次,它会找 system bundle 导出的包(在Equinox平台内部的包)。
  • 然后,它会找您的 import 的包,这个实际包含两种:一种是直接通过 require-bundle 的方式全部导入的,还有一种就是前面讲的通过 import package 方式导入的包。
  • 查找它的 fragment bundle,如果有的话。
  • 如果还没有找到,则会找自己的 classpath 路径(每个 bundle 都有自己的类路径)。
  • 最后它会尝试根据 DynamicImport-Package 属性查找的引用。

下面是IBM提供的一个例子。每个Bundle在启动的时候,都会调用Activator。

package osgi.test.helloworld; import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext; public class Activator implements BundleActivator { /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator *     #start(org.osgi.framework.BundleContext) */ public void start(BundleContext context) throws Exception { System.out.println("hello world"); } /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator *     #stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { } }

在其的.MF文件中,比一般java应用,要多出如下字段

Bundle-Activator Bundle 的启动器
Bundle-SymbolicName 名称,一般使用类似于 JAVA 包路径的名字命名
Bundle-Version  版本,注意不同版本的同名 bundle 可以同时上线部署
Export-Package  导出的 package 声明,其它的 bundle 可以直接引用
Import-Package  导入的 package
Eclipse-LazyStart   是否只有当被引用了才启动
Require-Bundle  全依赖的 bundle,不推荐
Bundle-ClassPath    本 bundle 的 class path,可以包含其它一些资源路径
Bundle-RequiredExecutionEnvironment 本 bundle 必须的执行环境,例如 jdk 版本声明

一个bundle可以有如下状态

INSTALLED    就是字面意思,表示这个 bundle 已经被成功的安装了
RESOLVED    很常见的一个状态,表示这个 bundle 已经成功的被解析(即所有依赖的类、资源都找到了),通常出现在启动前或者停止后
STARTING    字面意思,正在启动,但是还没有返回,所以您的 Activator 不要搞的太复杂
ACTIVE  活动的,这是我们最希望看到的状态,通常表示这个 bundle 已经启动成功,但是不意味着您的 bundle 提供的服务也是 OK 的
STOPPING    字面意思,正在停止,还没有返回
UNINSTALLED 卸载了,状态不能再发生变更了

一张经典的状态转化图如下

Equinox

简单来说Equinox,就是已经为你提供了若干bundle(system bundle)。
我们的 bundle 进入 Equinox 环境后,OSGi 框架对其做的事情如下:

  1. 读入 bundle 的 headers 信息,即 MANIFEST.MF 文件;
  2. 装载相关的类和资源;
  3. 解析依赖的包;
  4. 调用其 Activator 的 start 方法,启动它;
  5. 为其提供框架事件、服务事件等服务;
  6. 调用其 Activator 的 stop 方法,停止它;

一般基于OSGi的应用分成如下层次

通用第三方库层:这一层包括了常用的第三方库,例如 apache commons,jfreechart,xml 包等等,这一层需要将这些包全部 export 出去,这样上层就可以直接通过 require bundle 的方式使用这些包。
业务模型定义层:这一层依赖于(require-bundle)通用第三方库层,定义了应用的业务模型,例如各种 JavaBeans,也可以在这一层提供额外的应用统一配置服务,即为上层应用提供配置文件的管理服务。
业务逻辑实现层:这一层依赖于(require-bundle)通用第三方库层,还依赖于 (import package) 业务模型定义层提供的业务模型,定义了应用的业务逻辑,这一层可以细分为:
DAO(Database Access Object)服务层:即为上层应用提供数据库存取服务的层,其 export 出去的接口全部都是和数据库操作相关的;
Service 层:为 UI 层提供的业务逻辑的封装层,这样 UI 层只需要执行 service 层的接口即可,可以将更多的精力放在 UI 的设计;
展现维护层:这一层依赖于(require-bundle)通用第三方库层,和下面各层提供的管理服务接口,基于 HTTP 服务的方式提供应用的维护,例如配置文件的在线修改、服务的管理,bundle 的管理,日志的管理,内存的管理等等,这些都可以以“ RUNTIME ”的方式展现,管理员或者维护人员操作的就是 Equinox 运行环境。还可以实现大部分的操作不需要重启 JVM,这一点类似于 JMX。
事件服务:事件服务层是 OSGi 框架提供的标准服务之一,为除了通用第三方库层以外的各层提供事件服务,包括同步、异步的通知各种事件、发布各种事件等。通过事件服务,可以实现各层之间的联动。

OSGi-Equinox相关推荐

  1. OSGI+Equinox+idea HelloworldDemo

    OSGI+Equinox+idea HelloworldDemo 简单实现Helloworld,实现不停机加载卸载启动停止 Step1:下载Equinox Step2:创建idea项目 Step3:创 ...

  2. 深入理解OSGI Equinox原理应用与最佳实践 知识整理篇

    1.OSGI框架是什么? OSGI为实现Java模块化开发,实现热插拔功能化的框架实现.可以实现类似不重启系统也可以实现添加,删除其部分功能而不会导致系统崩溃的框架实现.一个功能相当一个模块,针对模块 ...

  3. Eclipse搭建OSGi Equinox最小运行平台

    1.Eclipse版本 Version: Neon Release (4.6.0) Build id: 20160613-1800 2.Equinox版本 org.eclipse.osgi_3.11. ...

  4. java osgi 启动原理_java – 以编程方式启动OSGi(Equinox)?

    可以使用FrameworkFactory API以编程方式启动任何OSGi框架(R4.1或更高版本): ServiceLoader ffs = ServiceLoader.load(Framework ...

  5. OSGI(面向Java的动态模型系统)和它的实现Equinox

    equinox  报错 英 ['ikwnks; 'ekw-] 美 ['ikwnɑks] 全球发音 跟读 口语练习 n. 春分:秋分:昼夜平分点 OSGi(Open Service Gateway In ...

  6. java osgi web开发_基于 OSGi 和 Spring 开发 Web 应用

    开发一个简单的OSGi Web应用实例 一个简单的Web应用 我们写一个简单的 Web 应用 compute.html :计算两个数字的和或乘积.如下图所示: 图1.一个简单例子 一个简单例子.bmp ...

  7. OSGi介绍及OSGi的Bundle应用

    http://blog.sina.com.cn/s/blog_50356fbb0100dytp.html 关键字: OSGi Bundle Plugin Eclipse 开放服务网关协议 (Open ...

  8. OSGI框架—HelloWorld小实例

    OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSGI官方联盟,另一方面指的是该组织维护的基于 ...

  9. OSGiBundle出现 Could not find bundle: org.eclipse.equinox.console的解决方案

    根据<深入理解OSGI equinox 原理 应用与实践>一书中,第五章 HelloWorld实例配置run configuration时出现Could not find bundle: ...

  10. maven,OSGI,karaf 学习笔记

    研一时在 opendaylight 控制器上开发过路由插件,当时开发时半懂不懂的,很多东西都没弄清楚.最近为找找工作做准备,准备重新好好学习 opendatlight. opendatlight 源码 ...

最新文章

  1. php文件上传绕过mime类型,文件上传限制绕过技巧
  2. 趣链 BitXHub跨链平台 (6)IBC通信协议
  3. oracle delete原理,如何恢复并理解oracle删除数据的原理
  4. 安装swig后,python3版本切换到了2
  5. 64位java_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?
  6. linux云管理,教程|云帮手部署Linux公有云管理系统
  7. 21行代码AC_HDU 5935 Car【贪心, 精度】
  8. Orchard之生成新模板
  9. ausam3x 嵌入式linux,ATSAM3X8EA-AU - 微控制器, 32位, SAM3X系列, ARM 皮质-M3, 84nb
  10. DataGridView绑定list的注意事项
  11. 洛谷1498-谢尔宾斯基三角形-python-(递归)
  12. Mac下打印机提示保持以备鉴定无法进行打印
  13. c语言结构体编程时钟,c语言简单数学时钟(结构体,指针),求大佬帮助
  14. 考研政治|马克思主义基本原理
  15. Java.math.BigDecimal.subtract()方法实例
  16. 浏览器报错:net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK)
  17. Object.defineProperty 以及 Proxy对比和基本语法 实干vue3数据响应
  18. 树洞程序php,Anonymous v20200926 – 秘密 PHP树洞程序
  19. Linux的vx开头的文件,微博 Qzone 微信 Linux文件及目录常用命令,进来瞅瞅
  20. Storj:区块链在云存储上的应用

热门文章

  1. 胡戈的“鸟笼山剿匪记”与馒头
  2. c7中取4c语言编程软件,使用scanf读取C程序中的文本
  3. 2018全球智能+新商业峰会:AI的“危”与“机”,梁建章、邢波、傅盛等大佬来揭秘| 互联网行业公会
  4. JForum论坛安装以及部署
  5. java登录页-视图界面_地图界面-Java集合
  6. fixedsys字体 win7_Win7 32位系统怎么显示默认隐藏字体
  7. 关于百度地图验证失败Authentication Error errorcode: -1 uid: -1 appid -1
  8. 672页21万字智慧高速数据中心大数据平台建设方案
  9. Godot特效:刀光(二)贴图制作
  10. 关于盒子模型的简单介绍