アプリケーションで JDBC データベース ドライバーを使用しています。これらを jar ファイルからロードします。現在使用している DB2 の場合は db2jcc.jar です。クラスパスにこのjarがあれば、すべて問題ありませんが、代わりにアプリケーションの構成ファイルのプロパティからjarを見つける必要があります-たとえば、
database.driver=/opt/IBM/db2/V9.5/java/db2jcc.jar
URLClassLoader を介してクラスをロードすることはできますが、問題は、こうして作成されたオブジェクトを明示的な DB2XADataSource として扱う必要があることです。例えば:
URLClassLoader dbClassLoader = new URLClassLoader(new URL[]{driverJar});
xaClass = dbClassLoader.loadClass("com.ibm.db2.jcc.DB2XADataSource");
DB2XADataSource dataSource = (DB2XADataSource) xaClass.newInstance();
dataSource.setCurrentSchema(DATABASE_SCHEMA); // <- dataSource has to be a
dataSource.setDatabaseName(DATABASE_NAME); // DB2XADataSource to do this
(多少再配置して名前を変更しました。実際には、このコードを含むクラスのコンストラクターで loadClass を実行しますが、newInstance はそのメソッドの 1 つにあります。)
クラスをロードしたクラスローダーがキャストを行うために DB2XADataSource を見つけようとしているのに、URL クラスローダーがツリー内でその上にないため、クラスローダーのもつれに陥っていると思います。問題は、その日 (ここイギリスで) 仕事をやめるべきだったのに、ずいぶんと時間が経ってしまったということです。
アイデア?
ありがとう。