查找已安装的 JDBC 驱动程序

问题描述 投票:0回答:3

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

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

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

java jdbc
3个回答
9
投票

到目前为止,您需要扫描整个类路径(和子文件夹)以查找实现

java.sql.Driver
的类。这样,您还可以覆盖那些Class#forName()手动加载或
META-INF/services
自动加载的驱动程序。
这是一个基本示例:

import java.lang.*; import java.io.*; import java.net.*; import java.util.*; import java.util.jar.*; 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
投票

java.sql.DriverManager.getDrivers()



3
投票
还不是全部。

正如

doc

所说

检索包含所有的枚举 当前加载的 JDBC 驱动程序 当前调用者有权访问。

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

通常,您会随程序可以运行的所有 JDBC 驱动程序 jar 一起交付软件。根据用户将连接到的内容(oracle、access、db2),程序必须加载适当的驱动程序。

© www.soinside.com 2019 - 2024. All rights reserved.