我遇到一个问题,当从BIRT脚本数据源中的脚本运行时Spring没有正确加载bean,但是单独运行OK。
这是一个最小的测试用例:
春豆:
package test;
import org.springframework.stereotype.Component;
@Component
public class TestComponent { }
上下文提供者:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringContextHolder {
private static ApplicationContext ac;
public static ApplicationContext getApplicationContext() {
if( ac == null ) {
ac = new ClassPathXmlApplicationContext("classpath:beans.xml");
}
return ac;
}
}
beans.xml中:
<beans .......>
<context:component-scan base-package="test"></context:component-scan>
<context:annotation-config />
</beans>
最后是测试程序,它是一个简单的Eclipse java项目,在其构建路径中包含所有spring和相关jar以及test.jar:
public class cltest {
public static void main(String[] args ) throws BeansException {
System.out.println(test.SpringContextHolder.getApplicationContext().getBean("testComponent"));
}
}
这个程序运行正常并提供bean。但是当我在BIRT设计器(4.3.0)中运行相同的jar时,通过在Report classpath首选项中设置它们,我得到一个例外:
发生了BIRT异常。有关更多信息,请参阅下一个例 Wrapped org.springframework.beans.factory.BeanDefinitionStoreException:无法读取候选组件类:URL [jar:file:/ C:/Users/xxx/.m2/repository/test/test/0.0.1-SNAPSHOT/test-0.0 .1 SNAPSHOT.jar /test/SpringContextHolder.class]!;嵌套异常是java.lang.ArrayIndexOutOfBoundsException:6
脚本源只是:
importPackage(Packages.test);
ts = SpringContextHolder.getApplicationContext().getBean("testComponent");
异常来自 org.springframework.asm.ClassReader ,其中readShort违反了某些数组边界。 Spring版本是3.2.3 RELEASE,Oracle Java 7u25,BIRT Designer 4.3.0。
有谁可以解释两种运行方案之间的区别是什么?当eclipse运行时加载jar时,可能会出现一些类加载器问题?