Загрузить драйвер JDBC без имени из внешнего JAR - PullRequest
1 голос
/ 30 сентября 2019

Я хочу, чтобы пользователь сам решил, какую базу данных использовать. Он должен просто предоставить JAR-файл соединителя и URL базы данных.

Проблема в том, что я не знаю имя класса драйвера.

Можно ли загрузить JAR с помощьюURLClassLoader и зарегистрируйте драйвер, не зная имени. До сих пор я находил решения только там, где имя драйвера известно.

Я также пытался добавить каталог относительно пути к классу моего экспортированного файла JAR (с помощью подключаемого модуля сборки maven), но он не работал.

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

Буду признателен за любую помощь.

1 Ответ

3 голосов
/ 30 сентября 2019

Все драйверы, совместимые с JDBC 4 и выше, содержат файл определения сервиса для использования с java.util.ServiceLoader. Если у вашего приложения есть драйвер в начальном пути к классу, вам не нужно ничего делать, поскольку java.sql.DriverManager автоматически загрузит эти драйверы.

Если драйвер находится на пути вторичного класса (например, вконтекст веб-приложения или загрузчик классов, инициализируемый вручную), тогда вам потребуется вручную загрузить драйвер, чтобы зарегистрировать его. В этом случае должна быть возможность использовать 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());
}

Единственное, что вам нужно знать, этоправильный URL-адрес JDBC для подключения.

Пожалуйста, примите во внимание, что это может вызвать утечку памяти, если ваш загрузчик классов имеет короткое время жизни: вам нужно явно отменить регистрацию драйвера, чтобы избежать такой утечки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...