Helloworld入门

准备:

eclipse 3.4

需要jar,—— eclipse 自带的,plugin下面有很多,抛开里面的jar,很多都是当前项目不需要的,如果不适用eclipse而是直接在jre上运行的话,估计只需要org.eclipse.osgi_3.2.0.v20060601.jar 就ok了吧

通过eclipse想到创建最简单的项目:

新建plugin项目,输入项目名字AAA(默认情况,向导会以这个为包名等等)——Target Platform一定要选择 an osgi framework( eclipse version的话,会有所不同,)—— 选择plugin template ‘Hello OSGi Bundle ’ -—— 会自动生成一些代码,—— 完成!——生成基本的代码框架,包括一个基本的Activator、 MANIFEST.MF等等。——以Equlix osgi  framework方式运行——控制台输出

运行:

osgi> Hello World!!

输入ss

Framework is launched.

id State Bundle
0 ACTIVE system.bundle_3.2.0.v20060601      -—— osgi最最底层的bundle —————— 高版本的osgi对应名字是 org.eclipse.osgi_3.4.0.v20080605-1900
1 ACTIVE AAA_1.0.0                 ——— 我们写的最最简单的bundle, 以bundle为最小单位部署

接着,我们可以修改MANIFEST.MF 或 Activator 看看输出有什么变化。

试验

场景:

HelloOSGI 依赖 HelloOSGIService,

HelloOSGIService提供 HelloOSGIService服务(及其实现),并负责注册发布服务出去。———— 需要的类:服务接口、服务实现、Activator

HelloOSGI 通过osgi机制引用HelloOSGIService的服务,(作为消费者消费服务)————需要的类:Activator引用上者提供的服务即可,具体做法:

通过context.getServiceReference(HelloOSGIService.class.getName());获取上者提供的服务引用ServiceReference(这是osgi专有的),然后

HelloOSGIService helloService=(HelloOSGIService)context.getService(helloServiceReference); —— 又通过context.getService( 服务引用 ) 方式获取服务。

小问题:  运行HelloOSGI没有出现期待的start osgi ! lk!,就是说没有执行HelloOSGI的Activator ,why:
osgi> ss

Framework is launched.

id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
5 RESOLVED com.javaworld.sample.HelloOSGI_1.0.0      ———— 解析了,但是未被激活? why
6 ACTIVE com.javaworld.sample.HelloOSGIService_1.0.0

—— 为什么HelloOSGI的状态是 RESOLVED———— 再一次思考, 虽然没看源码,但是可以猜测是这样,

HelloOSGI在HelloOSGIService 的前面,

osgi机制第一轮,循环顺序读取所有的bundle的信息,亦即MANIFEST.MF文件,记录其import 、export、 required等等信息( 统统放入独立的list或map之类容器中去)。  每读取一个bundle记录更新其状态为INSTALLED 。

osgi机制第二轮,循环顺序读取所有的bundle的import,required信息,然后取对应的list或map中查找,查找到了,表明可以被解析的,更新其状态为RESOLVED 。否则不做状态的更新。

osgi机制第三轮,按照start-level排序 (没有设置start-level则按照自然先后顺序排序),(疑问, 这一步是不是最开始就做好了的?)。 按从低到高的顺序启动各个bundle, 启动的时候检查其所依赖的bundle是否已经起来,如果已经起来,则它本身是可以正常启动的,否则启动失败(这进一步可能影响后续bundle的启动)。启动过程中更新其状态为 STARTTING,———— 如果启动很快,则这个状态很难被观察到———如果启动慢,后续bundle必须等待期启动完毕(可能成功也可能失败) 才继续———— 就是说启动过程是单线程的。。。————接着,启动完毕,若 启动成功则更新其状态为 ACTIVE 。 否则不做状态更新。

osgi框架启动over!!!

原来发现HelloOSGI_1.0.0的启动顺序先于HelloOSGIService_1.0.0,而前者依赖于后者,在后者未启动的时候执行前者,自然,前者的Activator不会被执行,修改启动顺序为HelloOSGI 3,HelloOSGIService 2后,一切ok:

osgi> start osgi ! lk!
ss

Framework is launched.

id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
5 ACTIVE com.javaworld.sample.HelloOSGI_1.0.0
6 ACTIVE com.javaworld.sample.HelloOSGIService_1.0.0

试验1:

不勾选任何Target Platform的bundle会怎么样? 结果是没有变化,一切正常—— org.eclipse.osgi应该是当前已经被IDE eclipse拉起的原因,无需拉起,若是jdk上,恐怕不行。

试验2:

不勾选com.javaworld.sample.HelloOSGIService会怎么样?

结果是HelloOSGI没法解析,其状态为INSTALLED (表示虽然加载,但是无法解析RESOLVED ), 而HelloOSGIService都不会被加载。

osgi> ss

Framework is launched.

id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.0.v20080605-1900
5 INSTALLED com.javaworld.sample.HelloOSGI_1.0.0

再次谈谈osgi bundle的几个基本状态的含义:    ———— 这些最基础的知识一定要理解,否则其他osgi的东西根本没法掌握,就像没学osgi一样。

激活: —— 就是指执行bundle对应Activator 的意思。 —— 可以有多个Activator, 应该不行吧。。

INSTALLED 表示osgi框架启动的时候有读取到这个bundle,仅此而已!  就是说,预定需要加载的,——就是说在eclipse osgi framework启动的时候有作为一员打勾的bundle ———— 够浅显了吧 —— 更具体呢? 不清楚, 就这个阶段而已, osgi 也是不会将其整个jar加载到jvm内存的吧, 只是记录其大致信息,做为下一阶段工作的输入

RESOLVED ——条件是其所有依赖也被成功RESOLVED 了? 那么有顺序的吗?

找到了依赖了吗? 应该是找到了(找到的意思是说,其依赖也被成功RESOLVED 了),但是没有激活——为什么呢, 因为此时其依赖被激活

ACTIVE ——这个是最终目的了, 条件应该是其所有依赖都已经激活了。

STOPPING

STARTTING

UNINSTALLED   这三个就不用说了,比较简单。

osgi 1的更多相关文章

  1. OSGi规范的C#实现开源

    这是大约在3-4年前完成的一个C#实现的OSGi框架,实现的过程参照了OSGi规范与与一些实现思路(感谢当时的那些资料与项目),此框架虽然仅在几个小型项目有过实际的应用,但OSGi的规范实现还是相对比 ...

  2. 分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

    在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群.这个分布式服务集群是基于DynamicProxy.WCF和OSGi.NET插件框架实现的.我将从设计思路.目标和实现三方面来描述. ...

  3. OSGi 基本原理

    定义 OSGi(Open Service Gateway Initiative)技术是面向Java的动态模型系统. 这个框架实现了一个优雅.完整和动态地组价模型.应用程序(称为bundle)无序重新引 ...

  4. 重新诠释的OSGi规范

    上周五部门开会讨论新一代产品(基于.net Winform)的设计规范,从设计规范慢慢讨论到体系结构等架构存在的问题,诸如菜单.工具条.状态条.界面布局等不能实现配置化和自动化,子系统之间拥有强依赖, ...

  5. Liferay7 BPM门户开发之38: OSGi模块化Bndtools、Maven、Gradle开发构建入门

    前言 OSGi是目前动态模块系统的事实上的工业标准,它适用于任何需要模块化.面向服务.面向组件的应用程序.Eclipse如此庞大和复杂的插件体系,就是基于OSGi.Liferay也是基于OSGi.OS ...

  6. 开源协议:LGPL协议、OSGi协议---打酱油的日子

    本文介绍开源的协议. LGPL 是 GNU Lesser General Public License (GNU 宽通用公共许可证)的缩写形式,旧称 GNU Library General Publi ...

  7. 原创:Equinox OSGi应用嵌入Jersey框架搭建REST服务

    一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Equinox OSGi应用嵌入Jersey框架搭建REST服务 1.新建插件工程HelloWebOSGI a. ...

  8. 转:OSGi 入门篇:模块层

    OSGi 入门篇:模块层 1 什么是模块化 模块层是OSGi框架中最基础的一部分,其中Java的模块化特性在这一层得到了很好的实现.但是这种实现与Java本身现有的一些模块化特性又有明显的不同. 本文 ...

  9. 转:OSGi 入门篇:生命周期层

    OSGi 入门篇:生命周期层 前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...

  10. osgi笔记

    Bundle-Classpath可以实现内嵌jar. 一个Bundle的Activator不需要进行Export 一个Package中的类被两个ClassLoader加载,包中的Private cla ...

随机推荐

  1. 百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?

    好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系 ...

  2. python基础第三天(1)

    函数 函数分为:内置函数,自定义函数,导入函数. 内置函数 python为咱们提供的快捷方式 vars()---针对脚本的,找到这个脚本中的所有变量. #!/usr/bin/env python # ...

  3. unity 实现物体破碎效果的一些方法

    游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...

  4. 讲解版的导航高亮(新手福利)原生JS

    1.先写样式: 导航的排版样式: 导航对应高亮样式: .d6000f{ background:red; } .d6000f a{ color:#fff; } 我这个地方导航高亮样式为背景红色,字体颜色 ...

  5. 4580: [Usaco2016 Open]248

    Description Bessie likes downloading games to play on her cell phone, even though she does find the ...

  6. 1306. Sorting Algorithm 2016 12 30

    1306. Sorting Algorithm Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description One of the f ...

  7. GERBER文件

    GERBER文件 GERBER文件是一种国际标准的光绘格式文件,它包含RS-274-D和RS-274-X两种格式,其中RS-274-D称为基本GERBER格式,并 要同时附带D码文件才能完整描述一张图 ...

  8. 分离式模型separation model

    1.关键字export 在头文件中定义模板,并且在模板的定义以及声明前添加关键字export. exported 模板可以直接使用,不需要看到该模板定义.模板的使用和定义可以分割于两个不同的编译单元. ...

  9. reduce方法

    API里面这样写 reduce(initial, sym) → obj                              reduce(初始值,符号) reduce(sym) → obj re ...

  10. Shmget 参数 0600的解释

    Shmget 参数 0600的解释 0660 百位6 -- 本用户有读写权. 十位6 -- 同组用户有读写权,个位0 -- 其它用户无读写执行权.与chmod 设法一样.