`
lyb520320
  • 浏览: 80059 次
  • 性别: 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()来设置当前线程的上下文类加载器。

分享到:
评论

相关推荐

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

    JVM、OSGI(Open Service Gateway Initiative)和Tomcat等容器都涉及到了类加载器的概念,理解它们的工作原理对优化应用性能和解决依赖冲突至关重要。 1. JVM类加载器: - **父类加载器**:在Java中,类加载器之间...

    java类加载器实例

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

    java类加载器1

    8. OSGi与类加载器: OSGi(Open Service Gateway Initiative)框架使用类加载器实现模块化,每个模块(Bundle)都有自己的类加载器,允许模块间的类隔离和动态加载。 总结,Java类加载器是Java平台的关键组成部分...

    深入探讨 Java 类加载器

    每个线程都有一个与之关联的类加载器,可以通过Thread.currentThread().getContextClassLoader()获取。这在某些情况下非常有用,例如在Web应用服务器中加载特定Web应用的类。 在Web容器(如Tomcat)中,每个Web应用...

    ClassLoader类加载机制

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

    java类加载器和核心机制.pdf

    OSGI提供了一个运行时环境,允许Java应用被部署到一个或者多个分布式服务器上,而类加载器在这样的环境下扮演着核心角色。 总的来说,类加载器和类加载机制是Java语言动态性的基础,了解它们的工作原理不仅有助于...

    深入探讨 Java 类加载器.pdf

    - **OSGi**:OSGi是一个Java平台的模块化框架,它通过类加载器机制实现了严格的模块化隔离,使得不同的模块之间可以动态加载、卸载以及更新,极大地提高了系统的灵活性和可维护性。 #### 结论 类加载器是Java生态...

    tomcat嵌入OSGI容器

    2. **类加载器调整**:由于Tomcat和OSGI都有自己的类加载机制,整合时需要调整Tomcat的类加载策略,以兼容OSGI的模块化特性。这可能涉及创建一个新的类加载器,用于加载OSGI Bundle内的类。 3. **配置管理**:OSGI...

    Java类加载原理解析

    除了这三种预定义的类加载器,Java还提供了一种特殊的**线程上下文类加载器(Thread Context ClassLoader)**,它允许在特定线程中加载类时使用非默认的类加载器。这在插件框架和OSGi等动态部署环境中尤其有用。 ...

    java ClassLoader机制及其在OSGi中的应用

    2. OSGi的ClassLoader支持动态加载和卸载bundle,当bundle被激活或停用时,对应的类加载器可以按需加载或释放类,提高了系统的灵活性和可维护性。 3. OSGi的ClassLoader还支持类的重用,如果两个bundle引用了相同的...

    JVM类加载机制详细讲解

    例如,使用 OSGi(Open Service Gateway Initiative)框架,就可以管理多个模块化应用的生命周期,每个模块有自己的类加载器,允许动态安装、卸载和更新。 1.5 常见问题分析 类加载过程中可能会遇到一些问题,如类...

    osgi介绍osgi介绍

    4. **类加载器**:每个bundle有自己的类加载器,负责加载bundle内的类,避免类冲突。 5. **Repository**:存储bundle信息的地方,bundle可以从其中获取依赖的bundle。 ### OSGi的应用场景: 1. **嵌入式系统**:...

    Java应用架构设计 模块化模式与OSGi.zip

    4. **命名空间隔离**:每个模块有自己的类加载器,防止类名冲突,保证了模块的独立性。 5. **版本控制**:OSGi支持同一服务的不同版本共存,允许模块根据需要选择使用哪个版本的服务。 在实践中,采用OSGi进行Java...

    类加载机制1

    这些错误往往与类加载器的工作方式以及类的加载顺序有关。 6. **自定义类加载器**: 开发者在需要动态加载类,比如热部署、插件系统或隔离不同版本的库时,可能会编写自定义类加载器。自定义加载器需要重写`load...

    osgi解决不同版本jar包冲突的demo

    为了解决这个问题,OSGi引入了模块化概念,每个模块(称为bundle)都有自己的类加载器,可以在同一环境中并行运行不同版本的库。 在"myself"工程中,我们创建了两个不同版本的“myself”jar包。每个jar包都包含了...

    OSGI 实例eclipse插件开发

    4. `org.springframework.osgi.extender`:这是Spring OSGI扩展器,它允许在OSGI环境中启动和管理Spring应用上下文。它监控bundle的生命周期,并在适当的时候初始化和销毁Spring应用上下文。 5. `osgi_serviceImpl`...

    OSGI.zip_osgi_osgi原理

    2. **类加载器机制**:OSGI引入了一种层次化的类加载器结构,每个服务单元有自己的类加载器,可以控制对类的访问,实现类的隔离。这使得一个服务单元中的类只对自己可见,除非明确导出给其他服务单元。 3. **依赖...

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

    3. **类加载器特技:OSGi代码生成**:"类加载器特技:OSGi代码生成.doc"可能探讨了OSGi如何利用其独特的类加载机制来实现动态代码生成和修改。由于每个bundle都有自己的类加载器,开发者可以创建在运行时动态生成或...

    OSGi原理与最佳实践 例子和pdf

    1. 模块系统:OSGi的核心是其模块系统,它基于Java类加载器的增强,使得每个模块(Bundle)都有自己的类加载器。这样,不同模块之间可以有明确的依赖关系,避免了类冲突问题。 2. 动态性:OSGi环境支持模块的动态...

    osgi重要文档--osgi核心规范文档,osgi服务文档,osgi-最佳原理与实践(王昊编著,共79页)

    每个bundle都有自己的类加载器,确保了不同bundle之间的类隔离。生命周期管理则涉及bundle的启动、暂停、停止和卸载操作,使开发者可以控制服务的动态性。服务注册与发现机制则通过服务事件和服务引用实现组件间的...

Global site tag (gtag.js) - Google Analytics