BIRT设计师的Spring bean加载问题

时间:2013-07-31 21:26:21

标签: eclipse spring birt

我遇到一个问题,当从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时,可能会出现一些类加载器问题?

0 个答案:

没有答案