OSGi概念入门

OSGi 是什么, OSGi 是一种服务运行平台。通过实现能够提供服务的符合 OSGi 规范的组件,用户可以将其组件发布到 OSGi 运行平台,供用户和其他组件使用。 OSGi 组件提供的服务具有两个层面的含义:系统层面,即一个组件为其他组件提供服务,这些服务体现为 Java 接口的实现;业务层面,即一个组件为外部系统或用户提供某种业务服务实现。

OSGi是什么

OSGi是什么,OSGi是一种服务运行平台。通过实现能够提供服务的符合OSGi规范的组件,用户可以将其组件发布到OSGi运行平台,供用户和其他组件使用。OSGi组件提供的服务具有两个层面的含义:系统层面,即一个组件为其他组件提供服务,这些服务体现为Java接口的实现;业务层面,即一个组件为外部系统或用户提供某种业务服务实现。

OSGi提供的功能

OSGi能够提供什么功能呢?我们将OSGi运行平台与常用的Web应用服务服务器做一个比较,来看OSGi提供的功能。首先,以tomcat为例,在tomcat容器中可以运行多个Web应用,假设存在两个Web应用A和Web应用B,一般说来,Web应用A和B具有各自的运行空间,两者之间不存在任何关联,A和B具有自己独立的生命周期,如部署、启动、停止和卸载等。

那么,是如何做到这一点的呢?很明显,这是通过JVM的类加载机制决定的。当tomcat运行并启动Web应用A和B时,tomcat为Web应用A和B各自构建了一个类空间,也可以看作是一个类域(Class Domain),Web应用A的类域包括JRE中的类,tomcat启动类路径上的类和Web应用A中WEB-INF目录下classes目录下的类和lib中的jar包;同样,Web应用B也有自己独立的类域,其范围除了JRE中的类,tomcat启动类路径上的类之外就是自己内部WEB-INF目录下classes目录下的类和lib中的jar包。现在提出一个问题,如果Web应用A需要使用Web应用B提供的Java类,怎么办?实现方式有多种,一种是将B提供的类打包,放置到应用A的WEB-INF/classes或WEB-INF/lib中;也可以将B提供的类放置到tomcat的类路径上,甚至是JRE的扩展目录下,但这样做在实际使用中或多或少存在一些问题。能不能在运行时Web应用A可以直接使用Web应用B提供的类呢?在运行时Web应用B能不能提供一个接口的实现,即类实例,由Web应用A使用呢?能不能提供一个应用C为应用A和应用B提供服务呢?显然,这些对于Web容器是不行的。

带着上述问题我们回到OSGi运行平台。可以将OSGi看作是Web容器的泛化,是更高级别的抽象。运行在OSGi环境中的类似于Web容器中的Web应用的组件即Bundle,不再仅仅局限于一个业务应用的概念,它的粒度更加精细,即可以看作是一个Jar包,为其他Bundle提供帮助类;也可以是一个HTTP服务组件,为其他Bundle提供http服务;还可以是一个Web容器,为其他Bundle提供Web应用服务。

那么,能不能解决上述提到的问题呢?我们假设在OSGi运行平台中包含了3个Bundle:A、B和C。对于问题一:Bundle A需要使用Bundle B中的某些实现类,如何实现?可以将Bundle B中的这些类通过Bundle B的元数据描述信息公开(Export)出去,使得这些类对OSGi平台中的所有Bundle可见,这些类资源仍然位于Bundle B中。Bundle A在其元数据描述信息中将Bundle B公开的类引入(Import)进来。在运行时,Bundle A就可以使用Bundle B提供的这些类,而不是需要将这些类拷贝到Bundle A中或其他位置。对于问题二:Bundle A可不可以直接使用Bundle B在运行时构建了类实例?Bundle B在运行时可以将Bundle A需要的类实例注册到OSGi运行平台的服务注册表中,类实例实现的接口可以通过上述问题一的方式使得Bundle A可见,那么,在运行时,Bundle A就可以通过该接口到OSGi平台服务注册表中查找Bundle B中提供的接口实现类实例,并调用该接口上的方法。现在来看问题三:Bundle C能不能为Bundle A和Bundle B共享呢?可以将上述问题二的解决方案中的Bundle B提供的接口定义提取到Bundle C中,并在Bundle C的元数据中公开,通过在Bundle A和Bundle B中同时引入Bundle C中发布的接口,Bundle B提供该接口的实现,Bundle A使用该接口实现提供的功能。这一切看上去是不是解决的非常完美呢?!

OSGi的实现机制

OSGi是如何实现的呢?从本质上说,OSGi是充分使用了Java的类加载机制,对模块和应用进行了更加精细粒度的控制,然后在类域上建立一系列松耦合应用。OSGi为每一个Bundle组件定义了一些元数据信息,通过这些元数据,OSGi在运行时为每一个Bundle构建了一个独立的类域(即类空间),详细描述参考OSGi之Bundle小节。

OSGi的组成

OSGi在R4种将功能分为几层,包括:安全层、模块层、生命周期层、服务层和实际的服务。OSGi的核心实现即为OSGi框架,它本身也是一个OSGi Bundle。

u OSGi的安全层(Security Layer)是一个可选的实现,该层基于Java2 安全架构,位于OSGi服务平台的底层对OSGi环境中应用的部署和管理提供更好的安全控制。

u OSGi的模块层(Module Layer)为基于Java的应用、组件的打包,部署和校验提供了一个通用的标准化的解决方案。其他类似的解决方案如JBoss、NetBeans。

u 生命周期层(Life Cycle Layer)为Bundle组件的安全和生命周期操作提供了API定义,该层位于安全层和模块层之上。

u 服务层(Service Layer)定义了一个与生命周期层紧密结合的组件动态交互模型。OSGi中的服务是实现了一个或多个Java接口的Java对象,通过将这些对象依据其实现的接口注册到服务注册表中,Bundle组件可以发布自己的服务,查找使用服务,注册监听处理服务的状态变更等。

u 实际的服务(Actual Services)是OSGi定义的一些标准的服务接口如日志服务(Log Service),包管理服务(Package Admin Service)、启动级别服务(Start Level Service)、HTTP服务(Http Service)、配置服务(Config Admin Service)、用户管理服务(User Admin Service)等等,详细的服务定义参考OSGi规范。

OSGi之Bundle

OSGi中的重要元素就是Bundle 和Service,Bundle提供了一种静态资源边界,类似于Web容器中的Web应用的概念。

每一个Bundle通过一个元数据文件(MANIFEST.MF)描述。OSGi框架(即SystemBundle)通过解析这个元数据文件对该Bundle进行加载和管理。Bundle通过元数据中的"Export-Package"属性将内部的类包发布给OSGi系统中其他Bundle使用,通过"Import-Package","Requie-Bundle"属性引用OSGi系统中其他Bundle发布的类包。

每一个Bundle有自己独立的类加载器(Fragment Bundle例外,其资源通过其Host Bundle加载),Bundle内部的资源(类,文件等)通过该类加载器查找和加载。Bundle的类加载器能够控制的类加载边界包括:启动类路径上的类资源,OSGi框架即SystemBundle上的类资源和Bundle内部的类资源。该类资源边界即形成该Bundle的类域。

每一个Bundle在OSGi框架中具有自己的生命周期,其生命周期内的状态包括:INSTALLED、RESOLVED、STARTING、ACTIVE、STOPPING和UNINSTALLED。

INSTALLED状态是Bundle的初始状态,当该Bundle部署到OSGi系统的Bundle Repository中时,Bundle的状态标记为INSTALLED。

Bundle内部的资源在加载之前,首先由OSGi框架对其进行解析(Resolve),解析的过程就是分析Bundle的元数据的过程,详细过程参考OSGi规范。解析后的Bundle进入RESOLVED状态,解析失败时,仍然处于INSTALLED状态。

Bundle内的资源被其它Bundle使用时,该Bundle被启动,也可以通过设定让OSGi框架在加载该Bundle时直接启动。

Bundle内的资源通过BundleContext与其他Bundle进行交互。元数据中的"Bundle-Activator"属性指定了实现BundleActivator接口的实现类,Bundle通过该类得到BundleContext,通过BundleContext可以查找其他的Bundle,查找注册在OSGi中的服务(Service)与OSGi环境进行交互等等。Bundle可以在其提供的BundleActivator实现类中进行初始化的工作,也可以注册服务到OSGi的服务注册表中,供其他Bundle查找使用。

开源的OSGi实现

Knopflerfish

http://www.knopflerfish.org

Oscar

http://oscar.objectweb.org

Equinox

http://www.eclipse.org/equinox

Flex

http://incubator.apache.org/flex

UnityWebGL异常捕获全攻略:从报错提示到完美解决的3种配置方案 本文详细解析了UnityWebGL项目中异常捕获的三种核心配置方案:禁用异常、仅捕获显式异常以及完全捕获异常(无堆栈跟踪)。通过对比不同方案在构建体积、运行性能及错误信息详细度上的差异,帮助开发者根据开发、测试与发布阶段的不同需求,选择并配置最优的异常处理策略,从而有效提升WebGL应用的调试效率和线上稳定性。 阅读详情

相关推荐

网络基础(二):数制转换与分类编址的IPv4地址

本文介绍数制转换、IP地址、分类编址的IPv4地址,希望对你有帮助!

十七拾的博客 1051

【OSGI】1.初识OSGI-到底什么是OSGI

目前,业内关于OSGI技术的学习资源或者技术文档还是很少的。我在某宝网搜索了一下“OSGI”的书籍,结果倒是有,但是种类少的可怜,而且几乎没有人购买。 因为工作的原因我需要学习OSGI,所以我不得不想尽办法来主动学习OSGI。我将用文字记录学习OSGI的整个过程,通过整理书籍和视频教程,来让我更加了解这门技术,同时也让需要学习这门技术的同志们有一个清晰...

weixin_33800463的博客 1249

Julia Ann老司机管理系统

https://content.badgirlsusa.com/Julia_Ann-Sexy_Julia_Ann_Fucks_A_Lil_Elf's_Big_Cock_/Julia-Ann-Naughty-America-%E6%80%A7%E6%84%9F%E7%9A%84%E8%A3%98%E8%8E%89%E5%A9%AD%E5%AE%89%E4%BA%82%E6%90%9E-lil-%E7%B2%BE%E9%9D%88%E7%9A%84%E5%A4%A7%E5%85%AC%E9%9B%9E-2020

www_oracle_com的博客 22万+

osgi

一、osgi详解 二、如何实现的

放羊的大飞 276

微信小游戏审核避坑指南:如何一次性通过微信审核(附最新审核要求)

本文详细解析微信小游戏审核全流程,提供从开发到上线的关键策略,帮助开发者一次性通过审核。涵盖合规性自查、材料优化、开发环境配置、版本管理、审核材料填写技巧等核心内容,并附最新审核要求和常见驳回问题解决方案,显著提升审核通过率。

weixin_28454475的博客 1403

多重共线性问题 -- 岭回归方法

概述 本篇博客分为三大部分,线性模型、多重共线性问题和岭回归。其中,线性模型中介绍了线性模型定义和普通最小二乘法对线性模型的拟合。第二部分,借由1987-2007年的人口、消费和科技对碳排放的影响的数据来说明多重共线性问题(包括如何从定性和定量两个方面判断多重共线性问题)和多重共线性问题对普通最小二乘估计的影响。第三部分,使用岭回归对第二部分中的多重共线性问题进行拟合,并基于R2R^2R2决定系数...

楚江客的记录 1万+

OSGI规范深入浅出

一、OSGI简介 1、OSGI简介 OSGI(Open Service Gateway Initiative),即开放服务网关协议,是面向Java的动态模型系统。 OSGI是指由OSGI Alliance组织制定的Java模块化规范,OSGI规范的核心部分是一个框架,其中定义了应用程序的生命周期模式和服务注册。基于OSGI框架定义了大量的OSGI服务:日志、配置管理,HTTP服务(运行Serv...

heyeqingquan的博客 2260

共享单车数据抓取与分析:使用Python爬虫抓取共享单车使用数据与地图信息

通过本篇博客,我们展示了如何使用Python爬虫抓取共享单车的使用数据和地图信息,并通过简单的数据分析得出有价值的见解。在实际应用中,数据的收集与分析不仅能帮助城市管理者更好地规划单车站点,还能为用户提供更精准的单车使用体验。未来,我们可以将此分析与机器学习模型相结合,进一步预测单车的使用趋势,优化调度算法,实现更加智能的共享单车管理。

2201_76125261的博客 2204

OSGI:简述对OSGI的认识

OSGI:简述对OSGI的认识 一、OSGI的概念 OSGI(Open Service Gateway Initiative,直译为“开放服务网关”)实际上是一个由OSGi联盟(OSGi Alliance)发起的以Java为技术平台的动态模块化规范。 OSGi联盟是由Sun Microsystems、IBM、Ericsson等公司于1999年3月成立的一个世界性的开放标准化组织,最初的名称为Co...

王小二(海阔天空) 1万+

UCIE Specification详解(五)

Logical Physical Layer(逻辑物理层)

Crazzy_M的博客 1219

Windows 11 安装 uv:手动下载、配置国内源

本教程详细介绍了在 Windows 11 系统下安装并配置 Python 包管理器 uv 的完整流程,包括配置环境变量 PATH、设置清华 PyPI 镜像源,以及创建收据文件以支持未来更新。适用于因网络限制无法通过官方脚本自动安装的用户,操作步骤清晰,配有图文指引,帮助读者高效完成本地部署。

寒水馨 · 轻量级技术文档 · hanshuixin.org 7597

【OSGI】OSGi概念入门

原文:http://marsvaadin.iteye.com/blog/1463142 OSGi概念入门   OSGi概念入门 OSGi是什么,OSGi是一种服务运行平台。通过实现能够提供服务的符合OSGi规范的组件,用户可以将其组件发布到OSGi运行平台,供用户和其他组件使用。OSGi组件提供的服务具有两个层面的含义:系统层面,即一个组件为其他组件提供服务,这些服务体

1287

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OSGI概念入门

OSGi是什么,OSGi是一种服务运行平台。通过实现能够提供服务的符合OSGi规范的组件,用户可以将其组件发布到OSGi运行平台,供用户和其他组件使用。OSGi组件提供的服务具有两个层面的含义:系统层面,即一个组件为其他组件提供服务,这些服务体现为Java接口的实现;业务层面,即一个组件为外部系统或用户提供某种业务服务实现。OSGi是什么OSGi是什么,OSGi是一种服务运行平

641

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OSGI概念理解和入门

  OSGI在java中也可以说是模块化技术,可以参考这篇博文:https://www.cnblogs.com/garfieldcgf/p/6378443.html   这句话说得很好:构造一个大型程序的主要工作很可能就只是根据需求选择合适的模块,然后再写少量的黏合代码而已。大概的意思就是可以使用软件来安装软件。比如很常见的jplugin等。这说明了一个解决复杂问题的通用的思路,分层(分类),也...

weixin_34334744的博客 141

OSGI-Bundle:概念和入门

简单的来说就是平台应用和bundle应用,如何将平台应用和bundle应用整个的运行起来,其中最关键的就是对bundles的控制,包括bundle安装、开启、关闭、更新和卸载。: bundle 是以 jar 包形式存在的一个模块化物理单元,里面包含了代码,资源文件和元数据(metadata),并且jar包的物理边界也同时是运行时逻辑模块的封装边界。实际工作中可以理解为bundle是一个小应用,一般是业务扩展方维护这个应用,里面有各种自身的业务逻辑和对平台应用的扩展。

master-dragon的专栏 821

OSGI入门(1)基本概念及使用DS来声明和引用服务

1.三个Bundle控制台命令 ss: 用于显示当前运行环境中安装的Bundle及其运行状态 start: 启动指定的Bundle stop:停止指定的Bundle 2.配置界面对应的配置文件存放目录 工作空间所在目录下的“.metadata\.plugins\org.eclipse.debug.core\.launches”文件夹下的.launch文件 3....

zpxiaoxiang的博客 272

OSGI

转自:http://developer.51cto.com/art/200909/154762.htm OSGi是近年来很火的一个Java EE名词,51CTO曾经发布的一篇《OSGi为什么重要:向模块化转移的主攻手》中,对于OSGi的优势进行了分析。然而有关OSGi的技术文章,至今仍比较少有,对于大家进行OSGi入门的过程有诸多不便。 51CTO编辑推荐:OSGi入门与实

rengq126的专栏 601

OSGi原理与最佳实践

OSGi原理与最佳实践市场价 :¥39.80 会员价 : ¥29.85(75折) 【作  者】林昊;曾宪杰 [同作者作品] 【丛 书 名】 博文视点原创精品大系 【出 版 社】 电子工业出版社 【书 号】 9787121092428 【上架时间】 2009-8-12 【出版日期】 2009 年8月 【开 本】 16开 【页 码】 256 样章试读及网上购买:http://www.c...

weixin_30924087的博客 130

OSGI第一讲:整体理解osgi

这一讲中,我们先来了解下什么是osgi,为什么使用osgi,osgi的开发工具有哪些等基本内容。 1、什么是osgi ? OSGI的英文全称是 Open Service Gateway Initiative ,直接翻译是 开放式的服务网关协议 。OSGI强调的是服务的概念。OSGI是一个服务平台,为JAVA开发环境提供各种服务(根据自己的业务逻辑,对java web来说,可能有用

michael Yang的专栏 2030

OSGi 入门开发学习资料必读系列

你好,OSGi!OSGi入门必读系列 OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构。本系列是JavaWorld上连载的一个OSGi入门系列,对于刚开始学习OSGi的读者有很大的帮助。 《你好,OSGi》系列的第一部分:你好,OSGi!OSGi入门必读系列 【1】参考资料:http://developer.51cto.com/art/200909/15476

云智禅师的专栏 1090

Karaf OSGi && JavaEE 通俗易懂版 实战教程入门(一)

出于工作需要我学习了下OSGi作为新项目的基础平台,但有感于该技术在实际运用上的资料匮乏,为避免他人也遇到同样的问题,特写下此文。希望能让看到的人能少走我走过的弯路。本文非JavaEE入门级教程,很多细节可能会被无意识的忽略,比如maven、jetty、javaEE各部件等等,你需要对这些有点基本了解。

cz_jjq的专栏 1万+
上一篇: OSGi概念入门
下一篇: OSGi之Bundle
chrisrc
博客等级 码龄20年 8粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值