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

Можно использовать отладчик жемчуга на тривиальной программе, как так:

perl -de1

, Кроме того, существует Alexis Sukrieh Консольное приложение Perl, но я не использовал его.

7
задан raven 3 December 2009 в 17:17
поделиться

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);
9
ответ дан 6 December 2019 в 14:05
поделиться

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

java.sql.DriverManager.getDrivers()
3
ответ дан 6 December 2019 в 14:05
поделиться
java.sql.DriverManager.getDrivers()

- это еще не все.

Как сказано в документе

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

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

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

3
ответ дан 6 December 2019 в 14:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: