从外部 JAR 加载没有名称的 JDBC 驱动程序

dan*_*1st 3 java jar jdbc maven

我希望用户决定使用什么数据库。他应该只提供连接器 JAR 文件和数据库 URL。

问题是,我不知道驱动程序的类名。

是否可以使用 a 加载 JARURLClassLoader并在不知道名称的情况下注册驱动程序。到目前为止,我只找到了驱动程序名称已知的解决方案。

我还尝试添加一个相对于我导出的 JAR 文件的类路径的目录(使用 Maven 程序集插件),但它不起作用。

<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
        </manifest>
        <manifestEntries>
            <Class-Path>libs/*</Class-Path>
        </manifestEntries>
    </archive>
</configuration>
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

Mar*_*eel 5

所有符合 JDBC 4 和更高版本的驱动程序都包含一个与java.util.ServiceLoader. 如果您的应用程序在初始类路径上有驱动程序,您不需要做任何事情,因为java.sql.DriverManager会自动加载这些驱动程序。

如果驱动程序位于辅助类路径上(例如在 Web 应用程序上下文中,或手动初始化的类加载器),那么您将需要手动加载驱动程序以使其注册。在这种情况下,应该可以使用ServiceLoader自己来枚举该上下文的类路径上的所有可用驱动程序。

这可以通过ServiceLoader.load?(Class<S> service)或来完成ServiceLoader.load?(Class<S> service, ClassLoader loader)。然后,您可以迭代(或流式传输)可用驱动程序的实例(这将自动使用 注册它们DriverManager)。

例如

ServiceLoader<Driver> drivers = ServiceLoader.load(java.sql.Driver.class, yourClassLoader);
for (Driver driver : drivers) {
    System.out.println(driver.getClass().getName());
}
Run Code Online (Sandbox Code Playgroud)

您唯一需要知道的是要连接的正确 JDBC url。

请注意,如果您的类加载器的生命周期很短,这可能会导致内存泄漏:您需要明确取消注册驱动程序以避免此类泄漏。