OSGi Classload错误一例

做了一个用户认证的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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值