现 在越来越多的Java开发人员在谈论OSGi是有其道理的。在几年前上学的时候我进行了比较多的Eclipse插件开发,当时就亲身感觉到Eclipse 插件体系的灵活与强大,而该体系与OSGi也可谓一脉相承、同气连枝。最近打算重新系统的研究一下OSGi,一边学习一边写一个OSGi探秘系列作为总 结,和大家分享,也请大家多给评价和建议。

在这一篇里面,我想先回答一个基本的问题:什么是OSGi?其实如果要很好地回答这个问题,也许先明白是什么导致了OSGi的产生和发展会有些帮助。

相信每个Java程序员都知道Classpath是什么。Java的类加载 器(Classloader)是一种分层结构,如下图所示,分为引导类加载器(Bootstrap Class Loader),扩展类加载器(Extension Class Loader),系统类加载器(System Class Loader)以及用户定义的类加载器(User-defined Class Loader)。引导类加载器在JVM时负责加载rt.jar里面的类,扩展类加载器负责加载在扩展目录下的jar文件中的类,系统类加载器则在 Classpath上面搜索类加载器,用户定义的类加载器则从用户指定的路径(比如一个网络URI)加载类。在该类加载体系中,一个类加载器总是先去上层 类加载器加载类,一层一层迭代,当无法找到需要的类时在自己加载。

在这种类加载机制中,存在以下几个问题:1)类版本冲突:当类路径上存在同一个类的不同版本时,如果类加载器找到一个版本,则不再搜索加载下一个版
本;2)无法确定jar之间的依赖关系:现有的JAR标准中缺乏对与Jar文件之间依赖关系的定义支持,因此只有在运行时间无法找到所需的类时,才会打出
java.lang.ClassNotFoundException,但这通常不能有效帮助开发人员解决问题;3)信息隐藏:如果一个jar在类路径上并
且被加载,那么所有该jar中的公共类(public
class)都会被加载,无法避免某些类被隐藏从而不被加载。尽管在J2EE中改进了类加载机制,可以支持以war或者ear应用为单元进行加载,但是这
些问题还是没有被很好地解决,并且热部署效果让人忧心。

OSGi就是为了克服这些问题而生,却又不局限与这些问题,对Java开发人员而言的确是好多顿大餐。OSGi是一个动态的Java模块(Module)
系统,它规定了如何定义一个Module以及这些模块之间如何交互。每个OSGi的Java模块被称为一个bundle。每个bundle都有自己的类路
径,可以精确规定哪些Java包和类可以被导出,需要导入哪些其它bundle的哪些类和包,并从而指明bundle之间的依赖关系。另外bundle可
以被在运行时间安装,更新,卸载并且不影响整个应用。通过这种方式,分层的类加载机制变成了网状的类加载机制。在应用程序启动之前,OSGi就可以检测出
来是否所有的依赖关系被满足,并在不满足时精确报出是哪些依赖关系没被满足。

当然,OSGi不止这些。我会在后续的系列文章中系统介绍什么是OSGi以及其内部的秘密。

概述什么是OSGi框架的更多相关文章

  1. Eclipse插件开发之基础篇(4) OSGi框架

    转载出处:http://www.cnblogs.com/liuzhuo. 1. 什么是OSGi框架 OSGi(Open Service Gateway Initiative)框架是运行在JavaVM环 ...

  2. OSGI框架学习

    OSGI框架三个重要概念 OSGi框架是根据OSGi规范中定义的三个概念层设计的:模块.模块生命周期.服务. 模块层定义了OSGi模块的概念(bundle,即包含一个元数据MANIFEST.MF的JA ...

  3. Springboot Application 集成 OSGI 框架开发

    内容来源:https://www.ibm.com/developerworks/cn/java/j-springboot-application-integrated-osgi-framework-d ...

  4. 将web容器置于OSGi框架下进行web应用的开发

    将web容器置于OSGi框架下,其实就是将web容器做成OSGi支持的Bundle,再安装到OSGi框架中,这里使用的是Jetty容器. 1.创建一个Eclipse插件项目,在此插件下创建一个WebR ...

  5. OSGI框架—HelloWorld小实例

    OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSGI官方联盟,另一方面指的是该组织维护的基于 ...

  6. [转]Eclipse插件开发之基础篇(4) OSGi框架

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/18/eclipse_plugin_1_2_1.html 1. 什么是OSGi框架 OSGi(O ...

  7. OSGI框架

    面向Java的动态模型系统 OSGi服务平台提供在多种网络设备上无需重启的动态改变构造的功能.为了最小化耦合度和促使这些耦合度可管理,OSGi技术提供一种面向服务的架构,它能使这些组件动态地发现对方. ...

  8. 想要将我们的OSGi框架中的批量日志单独打印到文件中

    我们的日志虽然没有直接依赖logback,但遗憾的是也没有使用slf4j,而是使用了Apache Common-Logging slf4j 和 common-logging有什么区别呢 common- ...

  9. OSGI框架中通过BundleContext对象对服务的注册与引用

    BundleActivator 在每个Bundle新建时都会默认生成Activator类,该类实现了BundleActivator类,实现了其start()和stop()两个方法 BundleCont ...

随机推荐

  1. ORA-06550:line 1,column 7;PLS-00201:indentifer '存储过程' must be declared;...PL/SQL Statement ignored 问题

    前段时间由于修改SMES系统,出现了一个问题. ORA-06550:line 1,column 7;PLS-00201:indentifer '存储过程' must be declared;...PL ...

  2. android 开发自建wifi热点的默认ip

    android 开发自建wifi热点的默认ip是:192.168.43.1  (小米3测试)

  3. CROSSTOOL-NG建立交叉编译工具链

    CROSSTOOL-NG建立交叉编译工具链 因为考试和学习的原因我已经一段时间没有玩我的JZ2440,现在终于考完试了,我再次找出了我的JZ2440.我之前学习的时候使用的是韦东山老师提供的开发工具, ...

  4. log4j使用感受

    1.为什么使用日志? 日志可以记录项目中的重要信息,关键输出信息,异常信息,为项目上线后期维护提供方便,在项目开发中尽量养成习惯写日志,而不是System.out.println()打印,不过在jun ...

  5. ARRAY_SIZE宏

    宏ARRAY_SIZE,是求设备结构体中设备的个数,   定义在linux/kernel.h中   #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[ ...

  6. sql中临时表的创建和使用【本文转自多人博客】

    本模块原网址:http://www.cnblogs.com/jeffwongishandsome/archive/2009/08/05/1526466.html 原作者:Jeff Wong 1.创建方 ...

  7. 华为3C抢购难度

    上周小米2S降价到1299买了一个,今天突然想体验一下抢购红米和3C的难度.万一抢到了,拿到手机市场贵100块钱卖掉,然后可以请女神吃个饭~~~哈哈哈哈! 结果确实不怎么好抢.刚刚试了一下3C: 验证 ...

  8. JVM基础学习

    public class TestJVM { // 运行时数据区[方法区.堆.程序计数器.虚拟机栈.本地方法栈] private static int _1M = 1024 * 1024; publi ...

  9. lintcode:最大子数组差

    题目 最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 样例 给出数组[1, 2, -3, 1], ...

  10. [hackerrank]Even Odd Query

    https://www.hackerrank.com/contests/w5/challenges 简单题,注意整数的0次方是1,奇数. #include <iostream> #incl ...