OSGI框架—HelloWorld小实例
背景
OSGI 盟已经开发了例如像HTTP服务器、配置、日志、安全、用户管理、XML等很多公共功能标准组件接口。这些组件的兼容性插件实现可以从进行了不同优化和使用代价的不同计算机服务提供商得到。然而,服务接口能够基于专有权基础上开发。
安全协议
框架结构
OSGI L0:运行环境

标准服务
OSGI 现这个接口,并在注册服务层注册该服务。服务的客户端在注册库中找到它,或者当它出现或者消失时做出响应。这个同SOA架构使用Web服务进行发布的方式相似。
框架服务
OSGI 选部分,指示框架的操作。框架服务如下:
系统服务
OSGI 服务,用户管理服务,IO连接器服务和参数服务都是系统服务的一个方面。
HelloWorld


|
install [URL]
|
将URL表示的bundle安装到框架中
|
|
uninstall [bundleID]
|
将id=bundleID的bundle卸载
|
|
start [bundleID]
|
启动一个bundle
|
|
stop [bundleID]
|
停止一个bundle
|
|
refresh [bundleID]
|
刷新bundle
|
|
update [bundleID]
|
更新bundle 的内容
|
|
ss
|
简单显示所有bundle的状态
|
|
status
|
展示安装的bundle和注册的服务
|
|
headers [bundleID]
|
展示bundle 的manifest中的元数据
|









|
1
2
3
4
|
package org.serc.helloworld;public interface Hello { void sayHello();} |
|
1
2
3
4
5
6
7
8
9
10
|
package org.serc.helloworld.impl;public class HelloImpl implements Hello{ final String helloString; public HelloImpl(String helloString){ this.helloString= helloString; } public void sayHello(){ System.out.println(this.helloString); }} |
|
1
|
Export-Package: org.serc.helloworld;version="1.0" |
|
1
2
3
4
5
6
7
8
9
10
11
12
|
package org.serc.helloworld.activator;public class Activator implements BundleActivator { private List<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>(); public void start(BundleContext ctx) { registrations.add(ctx.registerService(Hello.class.getName(),new HelloImpl("Hello, OSGi"), null)); } public void stop(BundleContext ctx) { for(ServiceRegistration registration : registrations) { System.out.println("unregistering:"+ registration); registration.unregister(); }} |
|
1
|
Bundle-Activator:org.serc.helloworld.activator.Activator |
|
1
2
3
4
5
6
|
Bundle-ManifestVersion:2Bundle-SymbolicName:org.serc.helloworldBundle-Version:1.0Bundle-Activator:org.serc.helloworld.activator.ActivatorImport-Package:org.osgi.frameworkExport-Package: org.serc.helloworld;version="1.0" |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package org.serc.helloworld.client;public class HelloUser implements BundleActivator { public void start(BundleContext ctx) { ServiceReference ref = ctx.getServiceReference(Hello.class.getName()); if(ref != null) { Hello hello = null; try{ hello= (Hello) ctx.getService(ref); if(hello != null) hello.sayHello(); else System.out.println("Service:Hello---objectnull"); }catch (RuntimeException e) { e.printStackTrace(); }finally { ctx.ungetService(ref); hello= null; } }else { System.out.println("Service:Hello---notexists"); } } public void stop(BundleContext ctx) throws Exception { }} |
|
1
2
3
4
5
|
Bundle-ManifestVersion:2Bundle-SymbolicName:org.serc.helloworld.clientBundle-Version:1.0Bundle-Activator:org.serc.helloworld.client.HelloUserImport-Package:org.serc.helloworld;version="[1.0,2.0)",org.osgi.framework |




相关书籍
深入理解OSGi
1.《深入理解OSGi:Equinox原理、应用与最佳实践》
[4]
R5.0中的核心规范进行了全面的解读,首先讲解了OSGi模块的建立、描述、依赖关系的处理,然后讲解了Bundle的启动原理和调度管理,最后讲解了与本地及远程服务相关的内容。第三部分:OSGi服务与Equinox应用实践(第5~11章),不仅详细讲解了OSGi服务纲要规范和企业级规范中最常用的几个子规范和服务的技术细节,还通过一个基于Equinox的BBS案例演示了Equinox的使用方法,最重要的是还通过源码分析了Equinox关键功能的实现机制和原理。第四部分:最佳实践(第12~14章),总结了大量关于OSGi的最佳实践,包括从Bundle如何命名、模块划分、依赖关系处理到保持OSGi动态性、管理程序启动顺序、使用API基线管理模块版本等各方面的实践技巧,此外还介绍了Spring
DM的原理以及如何在OSGi环节中进行程序测试。
[5]
Eclipse RCP与Spring OSGi
RCP相关的一系列核心概念、Eclipse
RCP开发环境的搭建,以及SWT、JFace、Forms、Nebula和WindowBuilder等Eclipse
RCP开发所常用的界面编程技术;高级篇(第6~12章)系统讲解了Eclipse RCP应用开发的基础知识、Eclipse
RCP软件产品各个组成部分的构建方法,以及Eclipse
RCP扩展的使用和扩展点的开发,掌握这些技术知识的读者将能构建一个结构完整的Eclipse
RCP软件,并解决软件开发过程中遇到的故障;实战篇(第13~15章)详细讲解了Eclipse RCP与Spring
OSGi框架、Hibernate ORM框架、JPA规范、Maven工具的整合,以及它与Java的模块化设计。
[6]
- 参考资料
-
- 1.
OSGi入门教程
.天码营[引用日期2015-12-28] - 2.
动态模型系统 OSGi
.开源社区网[引用日期2012-08-18] - 3.
OSGi开发环境建立和Hello World
.osgi中文社区[引用日期2013-05-28] - 4.
周志明,谢小明.《深入理解OSGi:Equinox原理、应用与最佳实践》.北京:机械工业出版社,2013:I-II
- 5.
陆阳.《Eclipse RCP与Spring OSGi:技术详解与最佳实践》.北京:机械工业出版社,2013:I-II
- 6.
软件工程国家工程研究中心
.北大未名站[引用日期2013-05-28]
- 1.
OSGI框架—HelloWorld小实例的更多相关文章
- ssh框架的小实例(用户登录)
刚学SSH框架写一个小实例,以便以后查看: 本案例简单的实现一个用户登录: 数据库方面就不写了,自己领悟吧!哈哈(根据user.hbm.xml文件就知道了) 我们一般可以创建下面几个包,什么意思呢,自 ...
- Spring3.0 与 MyBatis框架 整合小实例
本文将在Eclipse开发环境下,采用Spring MVC + Spring + MyBatis + Maven + Log4J 框架搭建一个Java web 项目. 1. 环境准备: 1.1 创建数 ...
- [置顶] Cocos2d-x 实例源码分析之二 小实例的主框架
这篇文章是分析第一个小实例ActionTest的源码.其实所有实例程序的结构都是一样的,只有特定方法里的代码不同,大的框架都是一样的.也就是说看完这篇文章你就可以自己开始分析其他源码了. 废话不多说, ...
- 从一个简单的小实例分析JSP+Servelt与JSP+Struts2框架的区别
最近在学struts2,struts2相比以前的JSP+Servlet,在处理流程上的更简单,我们就一个小实例来具体分析一下. 实例内容如下: 实现一个简单的注册页面包括:用户名.密码.重复密码.年龄 ...
- MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
前言: 刚刚学完了MVC,根据自己的感悟和理解写了一个小项目. 完全按照MVC模式,后面有一个MVC的理解示意图. 用MVC模式重新完成了联系人的管理系统: 用户需求: 多用户系统,提供用户注册.登录 ...
- Spring初识(通过小实例清晰认识Spring)
1.spring架构: spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,iba ...
- spring+mybatis之声明式事务管理初识(小实例)
前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...
- Springboot Application 集成 OSGI 框架开发
内容来源:https://www.ibm.com/developerworks/cn/java/j-springboot-application-integrated-osgi-framework-d ...
- Eclipse IDE下的Spring框架使用简单实例
Eclipse IDE下的Spring框架使用简单实例 1 准备Java jdk安装. Eclipse软件安装.根据系统安装32/64版本,选择Eclipse IDE for Java Develop ...
随机推荐
- beans.xml的用法
beans.xml <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="ht ...
- python把中文文档变为拼音
缘由 新看到的一篇文章,被吓尿.Text Understanding from Scratch,认为word的cnn抽象能力还不够好,使用character来做cnn效果更佳.结果是,由于论文的使用的 ...
- spring中事务传播解读:PROPAGATION_REQUIRES_NEW
第一步:获取事务状态,判断当前事务线程是否存在.第二步:如果当前事务的传播行为为PROPAGATION_REQUIRES_NEW,挂起当前线程绑定的事务,取消当前事务的sessionHolder和co ...
- Unix系统编程()malloc和free的实现
尽管malloc和free所提供的内存分配接口比之brk和sbrk要容易许多,但在使用时仍然容易犯下各种编程错误. 理解malloc和free的实现,将使我们洞悉产生这些错误的原因以及如何才能避免此类 ...
- C#代码获取或设置Iframe中的HTML
在最近的数据采集研究中, 发现很多页面的内容都是在iframe中的, 这位采集带来了不少困难. 经过一番思考之后, 我想到了C#的解决办法: 1. 运行Spider Studio, 加载页面 http ...
- 脚本中出现“+ $'\r' : command not found
脚本中的部分应该是从doc直接拷过来的,造成回车符“\r”出现问题 通过将脚本内容在linux下拷贝一次,就解决了这个问题!
- div随页面滚动遇顶固定的两种方法(js&jQuery)
一.遇顶固定的例子 我一直以为是某个div或层随屏幕滚动,遇顶则固定,离开浏览器顶部又还原这样的例子其实不少,其实它的名字叫“层的智能浮动效果”.目前我们在国内的商业网站上就常常看到这样的效果了.例如 ...
- sqlServer的主键只能自增不能手动增加
1. 2.找到相应的表,找到表设计.
- 多个 label checkbox 组合 显示在同一个水平线上[前提Bootstrap框架]
<th align="left" valign="middle"> <label class="checkbox inline fo ...
- 用 malloc 或 new 申请内存之后,应该立即检查指针值是否为 NULL
用 malloc 或 new 申请内存之后,应该立即检查指针值是否为 NULL. 防止使用指针值为 NULL 的内存. #include <iostream> #include <s ...

