Поиск установленных драйверов JDBC

Я пишу инструмент проверки базы данных на Java и имею экраны предпочтений, чтобы пользователь мог определить свои подключения к базе данных. Инструмент должен быть в состоянии справиться с DB2, Oracle, Postgresql и Mysql как минимум.

Что я действительно хотел бы, чтобы иметь возможность представить пользователю список установленных драйверов jdbc как часть этого процесса.

может ли кто-нибудь предоставить фрагмент кода для обнаружения установленных драйверов JDBC ?

3 ответов


к моменту, вам нужно сканировать весь путь к классам (и подпапки) для классов, реализующих 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);

Это должно помочь:

java.sql.DriverManager.getDrivers()

java.sql.DriverManager.getDrivers()

Не все.

Как doc говорит

извлекает перечисление со всеми загруженные в настоящее время драйверы JDBC к которому у текущего абонента есть доступ.

это означает загруженные драйверы (с классом.forName ()), не установлен (скажем, доступен через банку).

обычно вы доставляете свое программное обеспечение со всеми JDBC driver jars, которые может работать ваша программа. Зависит от того, к чему подключится пользователь (оракул, доступ, DB2) в программу должен загружаться драйвер appropiated.