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

问题描述 投票:1回答:1

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

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

是否可以使用URLClassLoader加载JAR并在不知道名称的情况下注册驱动程序。直到现在,我仅找到已知驱动程序名称的解决方案。

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

<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
        </manifest>
        <manifestEntries>
            <Class-Path>libs/*</Class-Path>
        </manifestEntries>
    </archive>
</configuration>

任何帮助将不胜感激。

java maven jdbc jar
1个回答
3
投票

所有兼容JDBC 4和更高版本的驱动程序都包含一个与java.util.ServiceLoader一起使用的服务定义文件。如果您的应用程序在初始类路径上具有驱动程序,则无需执行任何操作,因为java.sql.DriverManager将自动加载这些驱动程序。

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

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

例如

ServiceLoader.load​(Class<S> service, ClassLoader loader)

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

[请注意,如果您的类加载器的寿命很短,这可能会导致内存泄漏:您将需要显式注销驱动程序以避免这种泄漏。

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