2016-10-29 3 views
1

の指示に従って複数のOralce JDBCドライバを使用して2つのOracleデータベースに接続しようとしています。カスタムURLClassLoaderはカスタムクラスパスを使用しません

Oracle 11gに接続するデフォルトのClassLoaderのクラスパスにojdbc6.jarがあります。別のデータベースは、Oracle 8Iに接続する

enter image description here

ドライバクラスの位置が印刷される最後の行では、

File driverJar = new File("D:/workspace/ccbs/lib/classes12.jar"); 
String driverClassName = "oracle.jdbc.OracleDriver"; 
String con = "jdbc:oracle:thin:@db1host:5555:db1"; 
URL[] classpath = new URL[] {driverJar.toURI().toURL()}; 
URLClassLoader driverLoader = new URLClassLoader(classpath, ClassLoader.getSystemClassLoader()); 
Class driverClass = driverLoader.loadClass(driverClassName); 
System.out.println(driverClass.getProtectionDomain().getCodeSource().getLocation()); 

を次のように、私は、コードを書きました。プログラムを実行すると、私はクラスパスからojdbc6.jarを削除し、再度プログラムを実行すると、私は、私は私のカスタムは、デフォルトでojdbc6.jarからoracle.jdbc.OracleDriverをロードするURLClassLoader理由を示唆してください

file:/D:/workspace/ccbs/lib/classes12.jar 

file:/D:/workspace/ccbs/lib/oravl01/oracle/11.2.0.2/jdbc/lib/ojdbc6.jar 

なってしまいましたカスタムクラスパスのclasses12.jarではなくクラスパス。

答えて

1

を利用して変更する必要があります。 ClassLoader documentationに記載されています。あなたの問題は、ちょうどあなたがURLClassLoaderのは、アプリケーションのクラスパスを使用していないことを確認してください。この方法に

URLClassLoader driverLoader = new URLClassLoader(classpath, null); 

URLClassLoader driverLoader = new URLClassLoader(classpath, ClassLoader.getSystemClassLoader()); 

を交換しようとし解決するには

+0

これは間違いなく良い解決策です。それを指摘してくれてありがとう – hammerfest

1

私はあなたのコードでいくつかのデバッグを行いましたが、実際それが発生します。このスレッドは、独自のカスタム親の最後のクラスローダを作成するためのソリューションを概説どうやら親クラスローダが順番に自分のクラスのロードを先行し、まだクラスパス

に彼が見つけた他のojdbc jarファイルをロードします:How do I create a parent-last/child-first ClassLoader in Java, or How to override an old Xerces version that was already loaded in the parent CL?

私が試してみましたこのスレッドの承認された解決策は、期待どおりに動作するようです。 driverJar変数に定義されているjarをロードします。唯一のあなたの次の2つのコード行は、答えはクラスローダ委譲モデルですParentLastURLClassLoader

ParentLastURLClassLoader driverLoader = new ParentLastURLClassLoader(Arrays.asList(classpath)); 
Class driverClass = driverLoader.loadClass(driverClassName); 
+2

クラスローダーの委任がうまくいかず、エラーが発生しやすくなります。これは可能ですが、最後の手段としてのみ使用することをお勧めします。 –

関連する問題