查找已安装的JDBC驱动程序

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

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

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

到目前为止,您需要扫描整个类路径(和子文件夹)以查找实现java.sql.Driver类。 这样,您还将涵盖Class#forName()手动加载或由META-INF/services自动加载的驱动程序。

这是一个基本的例子:

 public static void main(String[] args) throws Exception { List> drivers = findClassesImplementing(Driver.class); System.out.println(drivers); } public static  List> findClassesImplementing(Class cls) throws IOException { List> classes = new ArrayList>(); 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) found); } } catch (Throwable ignore) { // No real class file, or JAR not in classpath, or missing links. } } } } return classes; } public static List 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 found = new ArrayList(files.length); for (File file : files) { if (file.isDirectory()) { found.addAll(findFiles(file, pattern)); } else { found.add(file); } } return found; } 

相反,您也可以考虑使用Google Reflections API ,它可以在一行中执行此操作:

 Set> drivers = reflections.getSubTypesOf(Driver.class); 

这应该有所帮助:

 java.sql.DriverManager.getDrivers() 
 java.sql.DriverManager.getDrivers() 

不是全部。

正如医生说的那样

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

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

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