BIRT スクリプト データ ソースのスクリプトから実行すると、Spring が Bean を正しくロードしないという問題がありますが、それ自体は正常に実行されます。
最小限のテスト ケースを次に示します。
春の豆:
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;
}
}
ビーンズ.xml:
<beans .......>
<context:component-scan base-package="test"></context:component-scan>
<context:annotation-config />
</beans>
そして最後に、ビルド パスにすべての spring および関連する jar と上記の test.jar を持つ単純な Eclipse Java プロジェクトであるテスト プログラム:
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 ファイルをレポート クラスパス設定で設定して実行すると、例外が発生します。
BIRT 例外が発生しました。詳細については、次の例外を参照してください。ラップされた 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");
例外は、readShort がいくつかの配列境界に違反するorg.springframework.asm.ClassReaderから発生します。Spring のバージョンは 3.2.3 RELEASE、Oracle Java 7u25、BIRT Designer 4.3.0 です。
実行中の 2 つのシナリオの違いを説明できる人はいますか? jar が eclipse ランタイムによってロードされるとき、おそらくいくつかのクラス ローダーの問題でしょうか?