查找已安装的JDBC驱动程序

时间:2009-12-03 12:46:51

标签: java jdbc

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

我真正想要的是能够在此过程中向用户显示已安装的jdbc驱动程序列表。

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

3 个答案:

答案 0 :(得分:9)

到目前为止,您需要扫描实现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来完成这一切:

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

答案 1 :(得分:3)

这应该有所帮助:

java.sql.DriverManager.getDrivers()

答案 2 :(得分:3)

java.sql.DriverManager.getDrivers()

不是全部。

正如doc所说

  

使用全部检索枚举   当前加载的JDBC驱动程序   当前来电者有权访问。

这意味着已加载的驱动程序(使用Class.forName()),未安装(比如通过JAR可用)。

通常,您可以使用您的程序可以使用的所有JDBC驱动程序jar来交付您的软件。依赖于用户将连接到的内容(oracle,access,db2),程序必须加载相应的驱动程序。