Java 自定义URLClassLoader不使用自定义类路径

Java 自定义URLClassLoader不使用自定义类路径,java,oracle,jdbc,classloader,Java,Oracle,Jdbc,Classloader,我正在尝试使用多个Oralce JDBC驱动程序,按照中的说明连接到2个Oracle数据库 在连接到Oracle11g的默认类加载器的类路径中有ojdbc6.jar 为了连接到另一个数据库Oracle8i,我编写了如下代码 File driverJar = new File("D:/workspace/ccbs/lib/classes12.jar"); String driverClassName = "oracle.jdbc.OracleDriver"; String con = "jdbc

我正在尝试使用多个Oralce JDBC驱动程序,按照中的说明连接到2个Oracle数据库

在连接到Oracle11g的默认类加载器的类路径中有
ojdbc6.jar

为了连接到另一个数据库Oracle8i,我编写了如下代码

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());
在最后一行中,将打印驱动程序类的位置。运行程序,我得到了

file:/D:/workspace/ccbs/lib/oravl01/oracle/11.2.0.2/jdbc/lib/ojdbc6.jar
当我从类路径中删除
ojdbc6.jar
并再次运行程序时,我得到了

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

请说明为什么我的自定义URLClassLoader在默认类路径中从
ojdbc6.jar
加载
oracle.jdbc.OracleDriver
,而不是在自定义类路径中加载
classes12.jar

我对您的代码进行了一些调试,确实发生了这种情况。显然,父类加载器在类加载之前按顺序加载,并且仍然加载他在类路径上找到的另一个ojdbc jar

此线程概述了创建自定义父类last classloader的解决方案:

我已经尝试了这个线程的公认解决方案,它似乎像预期的那样工作;加载driverJar变量中定义的jar。使用ParentLastURLClassLoader只需更改以下两行代码

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

答案是类加载器委托模型。描述它

要解决您的问题,请尝试更换

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


通过这种方式,您可以确保URLClassLoader不使用应用程序类路径。

处理类加载器委托很棘手,而且容易出错。这是可能的,但我建议将其作为最后手段。这绝对是更好的解决方案;谢谢你指出这一点
URLClassLoader driverLoader = new URLClassLoader(classpath, null);