Поиск установленных драйверов JDBC - PullRequest
7 голосов
/ 03 декабря 2009

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

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

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

Ответы [ 3 ]

9 голосов
/ 03 декабря 2009

Кстати, вам нужно просканировать весь путь к классам (и подпапки) для классов, реализующих 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);
3 голосов
/ 03 декабря 2009
java.sql.DriverManager.getDrivers()

не все.

Как говорит документ

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

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

Обычно вы поставляете свое программное обеспечение со всеми банками драйверов JDBC, которые может работать ваша программа. В зависимости от того, к чему пользователь подключится (oracle, access, db2), программа должна загрузить соответствующий драйвер.

3 голосов
/ 03 декабря 2009

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

java.sql.DriverManager.getDrivers()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...