`
alfred.w
  • 浏览: 89714 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

类加载器与 OSGi[转]

    博客分类:
  • OSGI
阅读更多

类加载器与 OSGi

java 2010-06-13 12:03:14 阅读11 评论0字号:

  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 按钮后发生了什么 大体说清一个应用程序安

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

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

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

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

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

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

    ortools-java

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

    (JCL) Jar Class Loader-开源

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics