java - 动态加载的 JDBC 驱动程序的提取版本

标签 java jdbc classloader

我正在尝试以编程方式提取不同 JDBC 驱动程序的次要/主要版本。这些驱动程序在 jar 文件中动态提供并按如下方式加载:

URLClassLoader loader = new URLClassLoader(new URL[] { new URL("theNameOfTheJar") });
Driver driver = (Driver) Class.forName("theClassNameOfTheDriver", true, loader).newInstance();

System.out.println(driver.getMajorVersion());
System.out.println(driver.getMinorVersion());

我遇到的问题是,如果应用程序本身使用 Oracle 11g 驱动程序(首先在 DriverManager 中注册),则之后无法提取正确的 Oracle 10g 驱动程序版本。在这种情况下,上面的代码总是显示 11g 驱动程序版本而不是正确的 10g 版本。

我也尝试先注销所有驱动程序,但没有成功:

    Enumeration<Driver> drivers = DriverManager.getDrivers();

    while(drivers.hasMoreElements()) {

        Driver d = drivers.nextElement();

        try {
            DriverManager.deregisterDriver(d);
        } catch (SQLException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        }
    }

是否有可能提取正确的驱动程序信息?

最佳答案

好的,我终于找到问题了。这只是一个类加载器问题。

默认情况下,类加载器首先询问其父类是否可以加载该类。在我的例子中,“默认”类加载器已经加载了驱动程序。所以 URLClassLoader 没有从 jar 文件加载它。解决方案是将父类加载器显式设置为 null:

URLClassLoader loader = URLClassLoader.newInstance(new URL[] { url },
            null);

非常感谢@Evgeniy Dorofeev 将我推向正确的方向。

关于java - 动态加载的 JDBC 驱动程序的提取版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18188230/

相关文章:

java - 我可以通过配置 java.policy 文件来拒绝对 jvm 类的访问吗?

spring - 类加载器问题

java - android布局创建问题

java - JDBC MySQl 不显示结果集

java - tomcat中的引导类路径

java - 在java中是否值得对结果集进行计数来预分配数组?

java - JDK 1.5 中的 NVARCHAR

java - 客户端和服务器使用同一台机器

java - 如何全局读取MapReduce应用程序的辅助数据文件?

java - 参数处的springboot java mysql语法错误