做了一个用户认证的bundle,需要访问远程IBM LDAP服务器,是通过JNDI方式访问,用的是IBM JRE 1.4.2。结果在运行时,这个bundle在被某个bundle调用时总是出现某个类找不到,在被另一个bundle调用时又没有问题。实际上这个类就在ibmjndi.jar中,而ibmjndi.jar已经加入到这个bundle的classpath里面,很是奇怪。
在调试中,发现调用JNDI naming service的时候,它试图用reflect的方式去新建这个类实例,而且不是用默认的Classloader,而是在com.sun.naming.internal.VersionHelper12类中使用Thread.currentThread().getContextClassLoader()获得上下文的Classloader。在出问题的情况下,线程的context ClassLoader是发起调用的bundle的delegate classLoader,所以不能找到被调用bundle的classpath里面。而在没有问题的情况下,线程context classloader是org.eclipse.core.runtime.internal.adaptor.ContextFinder,有趣的是,它会顺着类的调用顺序,用每个类的classloader去试图load class,所以最终能够在被调用bundle里面找到对象类。
最终的解决办法,在在调用JNDI服务前,调用下面的代码:
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
这样就能将本bundle的classsloader放到线程context中,算是一个crack吧。
这就是一个OSGi应用中遇到classload问题的例子,为以后类似的情况做借鉴。
BTW,这里是IBM LDAP programming guide.
分享到:
相关推荐
总之,OSGI错误分析和解决是一个需要深入了解OSGI机制的过程。通过理解Bundle的生命周期、服务模型以及JMX的使用,开发者可以有效地定位并解决问题,确保OSGI应用程序的稳定运行。在实践中,不断学习和熟悉OSGI的...
OSGi(Open Services Gateway Initiative)学习笔记(一) 在IT领域,OSGi是一种模块化系统和Java服务平台,它提供了一种动态管理软件组件的能力。本文将深入探讨OSGi的基本概念、架构以及如何使用它来构建可扩展和...
OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序以模块化的方式构建,使得组件之间可以动态地发现、依赖管理和更新。本教程将详细讲解如何将OSGI部署为一个可运行的例子,...
OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建可模块化的Java应用程序。它提供了一种灵活的框架,使得开发者可以构建、部署和管理模块化组件,这些组件被称为服务或bundle。OSGI的核心理念是将...
OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序由一系列可独立更新和替换的模块组成,这些模块称为“bundle”。在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse...
OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它为开发人员提供了一种动态、模块化的运行时环境。在OSGi中,应用程序被分解为称为“bundle”的独立单元,这些bundle可以相互依赖并独立地加载、...
OSGI组件编程是一种在Java平台上构建模块化应用程序的方法,它由OSGi联盟制定标准,并被广泛应用于企业级软件开发,尤其是对于需要高度可扩展性和动态性的系统。在本教程中,我们将深入探讨如何使用Eclipse和Equinox...
OSGi(Open Services Gateway Initiative)是一种在Java平台上进行模块化编程的规范,它为Java应用提供了动态化、服务化和模块化的运行环境。OSGi规范定义了一组核心的Java包和Java类的框架,允许一个应用程序或组件...
OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...
《企业OSGi实战》一书是OSGi企业应用的权威指南,它不仅涵盖了OSGi在企业环境中的应用,还提供了Java企业版(Java EE)与OSGi特性的融合方法。本书详细介绍了模块化编程的重要性,以及OSGi如何强化Java的模块化能力...
OSGi(Open Service Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序拆分成独立的、可管理的模块,这些模块可以动态地安装、卸载和更新,而不影响系统的其他部分。在Java世界中,OSGi提供了一种...
OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化服务框架,它定义了一种标准,使得开发者能够构建可互操作的、动态的、模块化的软件系统。OSGi的核心概念是基于Java的模块化,它的主要目标是为...
OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许在单个Java虚拟机(JVM)上动态地发现、安装、更新和卸载软件模块。Servlet是Java Web开发中用于处理HTTP请求的组件。在这个“osgi...