查找已安装的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),程序必须加载相应的驱动程序。