当前位置: 首页 > 面试题库 >

查找已安装的JDBC驱动程序

禹兴安
2023-03-14
问题内容

我正在用Java编写数据库验证工具,并具有首选项屏幕,以便用户可以定义其数据库连接。该工具至少应能够应付DB2,Oracle,Postgresql和Mysql。

我真正想要的是能够向用户提供他们已安装的jdbc驱动程序列表,作为此过程的一部分。

任何人都可以提供用于发现已安装的JDBC驱动程序的代码段吗?


问题答案:

到目前为止,您需要扫描整个类路径(和子文件夹)以查找实现类的类java.sql.Driver。这样,您还将涵盖 没有
由手动Class#forName()或自动加载的驱动程序META-INF/services

这是一个基本示例:

public static void main(String[] args) throws Exception {
    List<Class<Driver>> drivers = findClassesImplementing(Driver.class);
    System.out.println(drivers);
}

public static <T extends Object> List<Class<T>> findClassesImplementing(Class<T> cls) throws IOException {
    List<Class<T>> classes = new ArrayList<Class<T>>();

    for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) {
        for (File file : findFiles(new File(root.getFile()), ".+\\.jar$")) {
            JarFile jarFile = new JarFile(file);
            for (JarEntry jarEntry : Collections.list(jarFile.entries())) {
                String name = jarEntry.getName();
                if (name.endsWith(".class")) try {
                    Class<?> found = Class.forName(name.replace("/", ".").replaceAll("\\.class$", ""));
                    if (cls.isAssignableFrom(found)) {
                        classes.add((Class<T>) found);
                    }
                } catch (Throwable ignore) {
                    // No real class file, or JAR not in classpath, or missing links.
                }
            }
        }
    }

    return classes;
}

public static List<File> findFiles(File directory, final String pattern) throws IOException {
    File[] files = directory.listFiles(new FileFilter() {
        public boolean accept(File file) {
            return file.isDirectory() || file.getName().matches(pattern);
        }
    });

    List<File> found = new ArrayList<File>(files.length);

    for (File file : files) {
        if (file.isDirectory()) {
            found.addAll(findFiles(file, pattern));
        } else {
            found.add(file);
        }
    }

    return found;
}

相反,您也可以考虑使用Google Reflections
API
,该API可在一行中完成所有操作:

Set<Class<? extends Driver>> drivers = reflections.getSubTypesOf(Driver.class);


 类似资料:
  • 问题内容: 我很难确定应该如何在我的debian 6.0服务器上为PostgreSQL安装JDBC驱动程序。我已将驱动程序.jar移至以下目录: 然后,教程讨论如何使用此代码: 但是,由于我是PostgreSQL的新手,所以我不知道应该把这行放在哪里,或者这是否正确。 我的问题是,除了将jar文件移动到此位置之外,为了在我的postgreSQL安装上安装JDBC驱动程序,我实际上需要做什么? 编辑

  • 我已经从http://dev.MySQL.com/downloads/connector/j/下载了MySQL“mysql-connector-java-gpl-5.1.26.msi”的JDBC驱动程序。但我想不出怎么用。http://dev.mysql.com/doc/refman/5.6/en/connector-j-binary-installation.html上的文档说明它是一个zip文

  • 我有一个新安装的Wildfly10应用服务器在独立模式下运行。我需要部署一个需要MySQL JDBC驱动程序的项目。我按照在JDBC驱动程序安装中找到的教程安装了驱动程序(我选择了模块安装)。重新启动WildFly后,我在console.log中读到: 信息[org.jboss.as.connector.subsystems.datasources](ServerService线程池--33)WF

  • 我正在运行在这里找到的TensorFlow GPU docker图像:https://www.tensorflow.org/install/install_linux#InstallingDocker 我在Ubuntu上运行这个。 我对docker容器是新手,我希望有人能帮我弄清楚如何让我的Jupyter笔记本看到我安装到主机上的硬盘。

  • 我尝试将Oracle JDBC驱动程序安装到Apache Geronimo,但没有成功。我正在使用ojdbc6。罐子 我将其复制到repository文件夹,并尝试先使用Geronimo的管理控制台设置Oracle XA池,但没有成功。它抱怨OracleDataSource的ClassNotFoundException缺少驱动程序。 然后,我尝试设置一个常规的Jdbc驱动程序(oracle瘦)。我

  • 在Eclipse BIRT数据资源管理器中为查询生成器添加JDBC数据库连接: 选择“查询生成器的JDBC数据库连接” 就这样。我可以使用此数据源来使用数据集。 下一个。 我希望使用更灵活的“JDBC数据源”,而不是以前成功使用的“查询生成器的JDBC数据库连接”。哦,我看到MySQL没有驱动程序类-Derby和Sample只有两个默认条目。 似乎JDBC驱动程序的有效注册没有添加(或注册?)司机