`
lyb520320
  • 浏览: 79245 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

类加载器与OSGi

 
阅读更多

OSGi™是 Java 上的动态模块系统。它为开发人员提供了面向服务和基于组件的运行环境,并提供标准的方式用来管理软件的生命周期。OSGi 已经被实现和部署在很多产品上,在开源社区也得到了广泛的支持。Eclipse 就是基于 OSGi 技术来构建的。

OSGi 中的每个模块(bundle)都包含 Java 包和类。模块可以声明它所依赖的需要导入(import)的其它模块的 Java 包和类(通过 Import-Package),也可以声明导出(export)自己的包和类,供其它模块使用(通过 Export-Package)。也就是说需要能够隐藏和共享一个模块中的某些 Java 包和类。这是通过 OSGi 特有的类加载器机制来实现的。OSGi 中的每个模块都有对应的一个类加载器。它负责加载模块自己包含的 Java 包和类。当它需要加载 Java 核心库的类时(以 java开头的包和类),它会代理给父类加载器(通常是启动类加载器)来完成。当它需要加载所导入的 Java 类时,它会代理给导出此 Java 类的模块来完成加载。模块也可以显式的声明某些 Java 包和类,必须由父类加载器来加载。只需要设置系统属性 org.osgi.framework.bootdelegation的值即可。

假设有两个模块 bundleA 和 bundleB,它们都有自己对应的类加载器 classLoaderA 和 classLoaderB。在 bundleA 中包含类com.bundleA.Sample,并且该类被声明为导出的,也就是说可以被其它模块所使用的。bundleB 声明了导入 bundleA 提供的类 com.bundleA.Sample,并包含一个类 com.bundleB.NewSample继承自 com.bundleA.Sample。在 bundleB 启动的时候,其类加载器 classLoaderB 需要加载类 com.bundleB.NewSample,进而需要加载类 com.bundleA.Sample。由于 bundleB 声明了类com.bundleA.Sample是导入的,classLoaderB 把加载类 com.bundleA.Sample的工作代理给导出该类的 bundleA 的类加载器 classLoaderA。classLoaderA 在其模块内部查找类 com.bundleA.Sample并定义它,所得到的类 com.bundleA.Sample实例就可以被所有声明导入了此类的模块使用。对于以 java开头的类,都是由父类加载器来加载的。如果声明了系统属性org.osgi.framework.bootdelegation=com.example.core.*,那么对于包 com.example.core中的类,都是由父类加载器来完成的。

OSGi 模块的这种类加载器结构,使得一个类的不同版本可以共存在 Java 虚拟机中,带来了很大的灵活性。不过它的这种不同,也会给开发人员带来一些麻烦,尤其当模块需要使用第三方提供的库的时候。下面提供几条比较好的建议:

  • 如果一个类库只有一个模块使用,把该类库的 jar 包放在模块中,在 Bundle-ClassPath中指明即可。
  • 如果一个类库被多个模块共用,可以为这个类库单独的创建一个模块,把其它模块需要用到的 Java 包声明为导出的。其它模块声明导入这些类。
  • 如果类库提供了 SPI 接口,并且利用线程上下文类加载器来加载 SPI 实现的 Java 类,有可能会找不到 Java 类。如果出现了 NoClassDefFoundError异常,首先检查当前线程的上下文类加载器是否正确。通过Thread.currentThread().getContextClassLoader()就可以得到该类加载器。该类加载器应该是该模块对应的类加载器。如果不是的话,可以首先通过 class.getClassLoader()来得到模块对应的类加载器,再通过Thread.currentThread().setContextClassLoader()来设置当前线程的上下文类加载器。

分享到:
评论

相关推荐

    java类加载器实例

    类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。

    JVM、Tomcat、OSGI等类加载器整理文档

    这里将JVM、OSGI、Tomcat以及OSGI和Web服务器整合平台的类加载器做了详细的说明和分析,能让你对类加载器的做一个较为系统的了解。

    ClassLoader类加载机制

    类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。

    深入探讨 Java 类加载器

    类加载器(class ...本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。

    深入探讨 Java 类加载器.pdf

    类加载器(class ...本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。

    个人搜集的osgi帮助文档,内涵多个pdf

    个人网上搜集的osgi开发文档,内涵OSGi_框架的组件运行机制.pdf,osgi规范中文版.pdf,OSGiSIP通信中间件架构设计.pdf,类加载器特技:OSGi代码生成.doc等

    JVM解毒——类加载子系统

    什么是类加载器,类加载器有哪些? 多线程的情况下,类的加载为什么不会出现重复加载的情况? 什么是双亲委派机制?它有啥优势?可以打破这种机制吗? 类加载子系统 类加载机制概念 Java虚拟机把描述类的数据从...

    felix-atomos:Apache Felix原子

    Atomos Atomos-使用OSGi Connect... 这允许框架通过使用其自己的类加载器实现来提供OSGi规范定义的隔离。 例如,仅允许捆绑包加载捆绑包本地的或通过Import-Package或Require-Bundle标头Import-Package类和资源。 将Ato

    concierge-tests:Eclipse OSGi 框架的测试用例 Concierge

    JUnit 4 的简单单元测试OSGi Concierge 框架将通过基于 Concierge 的 FrameworkLauncher 启动AbstractConciergeTestCase 基类将为简单测试提供帮助方法启动/停止框架安装和启动包检查已解决的包添加对在包类加载器...

    jboss-modules:模块化的类加载系统

    它实现了线程安全,快速和高度并发的委托类加载器模型,并与可扩展的模块解析系统耦合,这些模块组合起来构成了一个独特,简单且功能强大的系统,可用于应用程序执行和分发。 JBoss模块旨在与任何现有的库或应用...

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

    / 189 7.4.1 类与类加载器 / 189 7.4.2 双亲委派模型 / 191 7.4.3 破坏双亲委派模型 / 194 7.5 本章小结 / 197 第8章 虚拟机字节码执行引擎 / 198 8.1 概述 / 198 8.2 运行时栈帧结构 / 199 8.2.1 局部变量...

    Java虚拟机

    7.4.1 类与类加载器 7.4.2 双亲委派模型 7.4.3 破坏双亲委派模型 7.5 本章小结 第8章 虚拟机字节码执行引擎 8.1 概述 8.2 运行时栈帧结构 8.2.1 局部变量表 8.2.2 操作数栈 8.2.3 动态连接 8.2.4 方法...

    java猜数字源码-Android_Interview:Android面试题

    java猜数字源码 ...类加载器 OSGI Https请求慢的解决办法,DNS,携带数据,直接访问IP GC回收策略 画出 Android 的大体架构图 描述清点击 Android Studio 的 build 按钮后发生了什么 大体说清一个应用程序安

    com.packtpub.e4.advanced:“高级 Eclipse 插件开发”一书的代码库 978-1783287796

    第 6 章:理解服务加载器和类加载器 第 7 章:设计模块化应用程序 第 8 章:使用 EventAdmin 的事件驱动应用程序 第 9 章:使用 P2 部署和更新 第 10 章:Eclipse 中的用户帮助 标签 每个章节在存储库中都表示为一个...

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

    类加载机制 双亲委派 OSGI 算法 搜索 二分 排序 选择 冒泡 插入 快速 归并 堆 桶 基数 常用算法 贪婪 回溯 剪枝 动态规划 数据挖掘算法 KMP算法 GZZ算法 HASH分桶 关联规则算法 APRORIVE...

    ortools-java

    对于简单的类路径(普通 jars,没有嵌套,没有花哨的类加载器),捆绑本机并按需提取它们很容易,但是当出现嵌套 jars( )和 OSGi 加载( )等问题时,它变得非常重要出现。 在此之前的解决方案属于前者,难以...

    geda-genericdto:GeDA-通用DTO汇编器

    主要目标是在性能和体系结构灵活性方面的效率,以支持IoC ,复杂转换, ORM集成,多类加载器环境(例如OSGi)和数据传输控制。 周围有许多“数据映射器”,因此我们特别将GeDA称为汇编器,因为它不仅是数据映射器,...

    (JCL) Jar Class Loader-开源

    JCL是可配置,动态和可扩展的自定义类加载器,可直接从Jar文件和其他来源加载Java类。 它还可以与Web应用程序和Spring等IoC框架集成,并支持OSGi引导委派。

    java-tracing-agent:Java运行时动态跟踪

    在加载类时,将在执行之前对其进行修改。 如果我们更改跟踪配置,也可以在运行时修改类。 特征 运行时更新 可以在应用程序启动和运行时进行更改 跟踪配置JSON的任何更改都会在运行时获取并应用 可以在运行时打开或...

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

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

Global site tag (gtag.js) - Google Analytics