论坛首页 Java企业应用论坛

奇怪的OSGi-Spring类加载的问题

浏览 2664 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-19  
       调试程序时发现一个奇怪的类加载问题,描述如下:
       假设有一个Bundle,其中有类a.A和b.B:
java 代码
 
  1. package a;  
  2.   
  3. public class A{  
  4.     private B ab;  
  5.     public void setB(B b){  
  6.         this.ab = b;  
  7.     }  
  8. }  

以及他们的Spring配置:
xml 代码
 
  1. <bean id="bBean" class="b.B" />  
  2.   
  3. <bean id="aBean"  class="a.A">  
  4.   <property name="b" ref="bBean"/>  
  5. </bean>  

META-INF.MF中仅导出包a。

        现在启动该Bundle,A和B的ClassLoader都是CL1,这是毫无疑问的。但当使用Eclipse的OSGi控制台命令 update 时,问题出现了,会抛出异常“Failed to convert property value of type [b.B] to required type [b.B] for property 'b' ”,这个异常很奇怪,似乎有点自相矛盾。其实不然,update后,由于A所在包属于导出包,可能被其他Bundle共享,所以其ClassLoader仍为CL1,因此A中定义的变量ab的类型B是由CL1加载的,而此时的bBean在初始化时,其ClassLoader却是一个新的实例CL2。因此,虽然bBean和ab的类型都是b.B,由于两者的ClassLoader不同,所以就出现了上面的错误信息。
       这里的关键就是CL2的产生,为什么在update时要新生成一个ClassLoader实例?目前尚不清楚这个Bug属于Eclipse的OSGi控制台的还是OSGi-Spring项目本身,甚至是OSGi规范。请高人帮忙指点迷津。
   发表时间:2007-08-20  
今天看了一下org.osgi.framework.Bundleupdate方法的API,原来所有导出的类在update时都不能被更新,这也就是其ClassLoader还是原来的那个的缘故。只有调用PackageAdmin.refreshPackages或者整个框架重载时才会更新那些导出的类
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics