`

OSGi是什么(Java语言的动态模块系统 )

阅读更多

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

OSGi是什么

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

OSGi提供的功能

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

那么,是如何做到这一点的呢?很明显,这是通过JVM的类加载机制决定的。当tomcat运行并启动Web应用AB时,tomcatWeb应用AB各自构建了一个类空间,也可以看作是一个类域(Class Domain),Web应用A的类域包括JRE中的类,tomcat启动类路径上的类和Web应用AWEB-INF目录下classes目录下的类和lib中的jar包;同样,Web应用B也有自己独立的类域,其范围除了JRE中的类,tomcat启动类路径上的类之外就是自己内部WEB-INF目录下classes目录下的类和lib中的jar包。现在提出一个问题,如果Web应用A需要使用Web应用B提供的Java类,怎么办?实现方式有多种,一种是将B提供的类打包,放置到应用AWEB-INF/classesWEB-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运行平台中包含了3Bundle,ABC。对于问题一: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 ABundle B共享呢?可以将上述问题二的解决方案中的Bundle B提供的接口定义提取到Bundle C中,并在Bundle C的元数据中公开,通过在Bundle ABundle B中同时引入Bundle C中发布的接口,Bundle B提供该接口的实现,Bundle A使用该接口实现提供的功能。这一切看上去是不是解决的非常完美呢?!

 

OSGi的实现机制

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

OSGi的组成

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

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

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

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规范。

OSGiBundle

OSGi中的重要元素就是Bundle 和ServiceBundle提供了一种静态资源边界,类似于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的类域。

每一个BundleOSGi框架中具有自己的生命周期,其生命周期内的状态包括:INSTALLEDRESOLVEDSTARTINGACTIVESTOPPINGUNINSTALLED

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

分享到:
评论

相关推荐

    你好---OSGI

    OSGi是什么:Java语言的动态模块系统

    spring dm 动态模型

    OSGi,也称为 Java 语言动态模块系统,它为 Java 应用程序开发指定了一种模块方法,以及一组标准化的模块,用于管理模块之间的从属性。OSGi服务平台的Spring动态模型项目(即Spring动态模型,简称Spring DM)允许...

    OSGI入门实践

    OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础的架构。OSGi容器已经有多家开源的实现,比如:knoflerfish、Equnox、Apache的Felix。你可以通过这些容器,把你的应用程序划分为多个模块单元...

    JAVA上百实例源码以及开源项目

     使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...

    JAVA上百实例源码以及开源项目源代码

     使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...

    osgiaas:OSGiaaS-OSGi即服务

    OSGiaaS项目OSGi即服务 OSGiaaS项目旨在提供JVM模块和CLI,以简化真正模块化,动态应用程序的开发。 尽管所有模块都是OSGi捆绑包,但是许多模块也可以在没有OSGi的情况下使用(在标准Java应用程序中)。 有关详细...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    java语言 语言语法基础 异常 泛型 内部类 反射 序列化 nIo 匿名类 包装类 优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符串+正则 流 字符流 字节流 ...

    开源企业级ERP;CRM;SCM系统---idempiereServer8.2.gtk.linux.x86_64.zip

    这款软件主要面向中小企业提供财务、进销存、生产、人事、项目等模块功能,同时系统功能支持多国语言对应,可以对集团公司导入实施,也提供多帐套功能。 该软件使用JAVA进行开发,支持Oracle、Postgresql。(注:听说...

    Java虚拟机

    线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。 前言 第一部分 走近Java 第1章 走近Java 1.1 概述 1.2 Java技术体系 1.3 Java发展史 1.4 Java虚拟机发展史 1.4.1 Sun Classic ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 342 13.1 概述 / 342 13.2 线程安全 / 343 13.2.1 Java语言中的线程安全 / 343 13.2.2 线程安全的实现方法 / 348 13.3 锁优化 / 356 13.3.1 自旋锁与自适应自旋 / 356 13.3.2 锁消除 / 357 13.3.3 锁粗化 ...

    开源企业级ERP&CRM&SCM系统-idempiereServer7.1.gtk.linux.x86_64.zip

    这款软件主要面向中小企业提供财务、进销存、生产、人事、项目等模块功能,同时系统功能支持多国语言对应,可以对集团公司导入实施,也提供多帐套功能。 该软件使用JAVA进行开发,支持Oracle、Postgresql。(注:听说...

    开源企业级ERP;CRM;SCM系统-idempiereServer11.gtk.linux.x86-64

    这款软件主要面向中小企业提供财务、进销存、生产、人事、项目等模块功能,同时系统功能支持多国语言对应,可以对集团公司导入实施,也提供多帐套功能。 该软件使用JAVA进行开发,支持Oracle、Postgresql。(注:听说...

    Kotlin 语言文档

    Kotlin 语言文档 pdf 目录 概述 4 使用 Kotlin 进行服务器端开发 4 使用 Kotlin 进行 Android 开发 5 Kotlin JavaScript 概述 6 Kotlin 1.1 的新特性 7 ...与 Java 语言比较 186 与 Scala 比较【官方已删除】 187

    Kotlin语言文档 中文高清免费版

    Kotlin语言文档 中文高清免费版 概述 4 使 Kotlin 进 服务器端开发 4 使 Kotlin 进 ...

    all:所有liveSense模块

    liveSense建立在OSGi模型的基础上,该模型提供了模块化的动态运行时环境,在该环境中,模块可以在运行时进行管理。 技术 liveSense基于Apache Sling,它是一种内容驱动的CMS系统,可以使用多种脚本语言(ESP,Scala...

    JavaOSC:用于JVM语言的OSC内容格式“协议”库

    _ ____ _____ _____ | | / __ \ / ____| / ____| ... 它也是 (Java的动态模块系统)软件包。 在一个单独的程序包中,它还包含一个示例GUI,该GUI允许将OSC消息发送到SuperCollider。 开放声音控制(OSC) 是一个

    org.javacream.training.java9:Java 9更新培训

    org.javacream.training.java9 Java 9更新培训 基本优势 性能和内存占用量→拉起jre可能已经带来了优势 d。扩展图书馆 集合API工厂方法,其他小事情 React性编程模型(更极端的形式异步编程)温和的语言扩展(改进了...

    SOA系列:Eclipse应用技术

    先睹为快 Eclipse的SOA工具关注Eclipse 涉足SOA开发工具Swordfish: Eclipse公司基于OSGi的SOA架构 Eclipse技术开发 SOA是以服务/应用程序的方式进行创建和管理的, Eclipse的最终目标是为了完成共用的功能。我们...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

Global site tag (gtag.js) - Google Analytics