zoukankan      html  css  js  c++  java
  • OSGI基础知识整理

    一、             简介:

    OSGi(Open Service Gateway Initiative)技术是面向Java的动态模型系统。

    OSGi的主要职责就是为了让开发者能够创建动态化、模块化的Java系统。

    OSGi 的模块化,是通过为 Jar 包添加元数据(metadata)来定义哪些类该暴露,哪些类该隐藏,其控制单元叫做 Bundlejar 包)。;

    bundle 是以 jar 包形式存在的一个模块化物理单元,里面包含了代码,资源文件和元数据(Manifest.mf文件保存模块的元数据信息),并且jar包的物理边界也同时是运行时逻辑模块的封装边界。

     

    二、             常用基本命令:

    命令

    备注

    install

    将bundle安装到框架中

    uninstall

    bundle卸载

    start

    启动一个bundle

    stop

    停止一个bundle

    refresh

    刷新bundle

    update

    更新bundle 的内容

    ss

    简单显示所有bundle的状态

    status

    展示安装的bundle和注册的服务

    headers

    展示bundle 的manifest中的元数据

    三、             三层架构:

    OSGi框架从概念上可以分为三层:模块层、生命周期层和服务层:

    1. Module Layer(模块层):模块层主要涉及包及共享的代码;
    2. Lifecycle Layer(生命周期层):生命周期层主要涉及Bundle的运行时生命周期管理;
    3. Service Layer(服务层):服务层主要涉及模块之间的交互和通信。

     

    1.      模块层:

    模块层定义了OSGi模块的概念,模块即bundle,即包含一个元数据MANIFEST.MF的JAR文件,bundle比标准JAR文件更强大,它可以声明哪些包对外可见(Export-Package);所以说它扩展了Java的访问修饰符。

    bundle还可以明确声明依赖哪些外部包(Import-Package);

    1)     MANIFEST.MF文件的格式:

    属性声明的一般格式是name: value;

    在eclipse下可以手工编写这个文件,也可以通过可视化编辑工具进行编辑,可视化编辑和文件内容是同步;

     

    2)     OSGI定义信息:

    标识名

    备注

    Bundle信息

    Manifest-Version

    Manifest文件的版本号

    Bundle-ManifestVersion

    jar包应遵循的OSGI的版本号,目前都固定为2

    Bundle-Version

    OSGI插件(Bundle)的版本号

    Bundle-Name

    插件名称

    Bundle-SymbolicName

    插件标识名称,在系统中唯一标识名称,后面可带上singleton标识,如果singleton标识为True则表示单例;

    Bundle-RequiredExecutionEnvironment

    运行此插件所需的执行环境及版本号(比如JavaSE-1.7)

    Bundle-Activator

    Bundle启动器实现类

    可见性标识

    Import-Package

    用于声明Bundle需要导入哪些Package

    Require-Bundle

    定义依赖的 Bundle

    Bundle-Classpath

    描述了Bundle加载器的Classpath范围,即Bundle加载器应该到哪里去查找类(比如Bundle-ClassPath: .,即Bundle跟目录下的所有包)

    Export-Package

    声明Bundle要导出哪些Package

    3)     Import-Package 与 Require-Bundle的区别:

    Import-Package 与 Require-Bundle很相似,都是定义了导入包依赖的方式;

     

    从图中可以看出Require-Bundle 会对整个 Bundle 产生依赖,也就是说 Bundle 所 Export 出的包都会被 A 加入到自己的类空间,而 Import-Package 只会对指定的包产生依赖关系。

    在大多数情况下,都应该使用 Import-Package 而不是 Require-Bundle 。 Import-Package 比 Require-Bundle 更利于 Bundle 的部署和版本维护,同时在查找类的时候有更高的效率。

    2.      生命周期层:

    1)  生命周期层的主要功能是控制动态安装、开启、关闭、更新和卸载的bundles。

    2)   生命周期层关注于提供执行时模块管理、和对底层OSGi框架的访问。

    3)   在标准的Java编程中,可以通过将jar包放到classpath中来使用它。而bundle则不是这样,Bundle只有在被安装和启动(install/Start)后才能用起来。并且OSGi框架支持对这些bundle完整的生命周期管理,并且支持这些管理操作在应用执行完成。

    服务接口:

    序号

    服务名

    说明

    1

    BundleActivator

    捕捉bundle的start和stop事件,并对这两个事件作出自定义的反应。

    2

    BundleContext

    一个bundle在框架中的执行时上下文,这个上下文提供了和框架进行交互的方法。

    3

    Bundle

    在逻辑上表示了一个bundle,OSGi环境中的一个物理bundle对应了一个bundle对象。该对象中包含了bundle的基本信息和bundle生命周期的控制接口。

    启动Bundle的两种方式:

    1)   BundleActivator启动;

    2)   OSGI-INF下的xml文件中指定activate和deactivate方法;

    3.      服务层:

    服务层关注于模块,特别是模块内的组件间的交互和通信。

    服务提供者将服务发布到服务注册中心,服务客户端搜索服务注册中心,查找可供使用的服务。

     

    1)     注册和检索服务:

     

    2)     OSGI中提供的注册和检索服务:

     

    MessageManager manager = ServiceLookupUtil.lookupService(MessageManager.class);

  • 相关阅读:
    找数字(递归,二分查找)
    P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
    第五讲 二维费用的背包问题(粗糙,勿点)
    VIM基础操作方法汇总
    P2347 砝码称重(动态规划递推,背包,洛谷)
    第三讲 多重背包问题(对背包九讲的学习)
    第二讲 完全背包问题(对背包九讲的学习)
    python 日期、时间、字符串相互转换
    Resource注解无法导入依赖使用javax.annotation的注解类
    Spring的配置文件找不到元素 'beans' 的声明
  • 原文地址:https://www.cnblogs.com/laoxia/p/7672668.html
Copyright © 2011-2022 走看看