调试程序时发现一个奇怪的类加载问题,描述如下:
假设有一个Bundle,其中有类 a.A和 b.B:
以及他们的Spring配置:
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规范。请高人帮忙指点迷津。
假设有一个Bundle,其中有类 a.A和 b.B:
java 代码
- package a;
- public class A{
- private B ab;
- public void setB(B b){
- this.ab = b;
- }
- }
以及他们的Spring配置:
xml 代码
- <bean id="bBean" class="b.B" />
- <bean id="aBean" class="a.A">
- <property name="b" ref="bBean"/>
- </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规范。请高人帮忙指点迷津。