Java: Не найдено подходящих драйверов для jdbc: h2

У меня возникла проблема с некоторыми из моего кода, я искал и пробовал все, что я знаю, без везения.


Сценарий:

  • Приложение проверяет, существует ли драйвер JDBC, в данном случае драйвер H2 (org.h2.Driver).
  • Если он не существует, приложение загружает драйвер JDBC и добавляет его в ClassLoader следующим образом: ( note: storageDataManager - это класс, который я использую для SQL-методов)

       File h2Driver = new File(directory.toString() + File.separator + "lib" + File.separator + "h2.jar");
       if (h2Driver.exists()) {
           URL[] url = new URL[0];
           try {
               url = new URL[]{h2Driver.toURI().toURL()};
               storageDataManager.setClassLoader(new URLClassLoader(url));
           } catch (MalformedURLException ignore) {}
        }
    

Когда storageDataManager запускает первый запрос, он пытается подключиться к указанному драйверу, и если он имеет классLoader, вместо него он использует ClassLoader:

if (getClassLoader() != null) {
    getLogging().debug("Loading custom class loader for H2 driver: " + getClassLoader().toString());
    Driver driver = (Driver) Class.forName("org.h2.Driver", true, getClassLoader()).newInstance();
    getLogging().debug("Loaded H2 driver: " + driver.toString() + " - " + driver.getMinorVersion() + " - " + driver.getMajorVersion());
    DriverManager.registerDriver(driver);
} else {
    getLogging().debug("Loading H2 driver.");
    Class.forName("org.h2.Driver");
}
outputDrivers();
this.con = DriverManager.getConnection(this.url, this.username, this.password);
break;

Когда я запускаю приложение, я получаю эту ошибку:

"* Не найдено подходящего драйвера для jdbc: h2: плагины \Odin\data\OdinStorage; AUTO_RECONNECT = TRUE *"

Здесь полный журнал:

[Debug] Loading custom class loader for H2 driver: [email protected]
[Debug] Loaded H2 driver: [email protected] - 3 - 1
[Debug] Checking DriverManager drivers.
[Debug] Found driver #1: sun.jdbc.odbc.JdbcOdbcDriver
[Debug] Found driver #2: com.mysql.jdbc.Driver
[Debug] Found 2 drivers in DriverManager.
--------------------------- STACKTRACE ERROR ---------------------------
Class name: java.sql.DriverManager
Error message: No suitable driver found for jdbc:h2:plugins\Odin\data\OdinStorage;AUTO_RECONNECT=TRUE
Error cause: null
File name: null
Function name: getConnection
Error line: -1
--------------------------- STACKTRACE START ---------------------------
java.sql.DriverManager.getConnection(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source)
com.craftfire.commons.managers.DataManager.connect(DataManager.java:756)
com.craftfire.commons.managers.DataManager.executeQuery(DataManager.java:526)
com.craftfire.odin.managers.StorageManager.checkInventoryDatabase(StorageManager.java:65)
com.craftfire.odin.managers.StorageManager.checkDatabases(StorageManager.java:56)
com.craftfire.odin.managers.StorageManager.<init>(StorageManager.java:34)
com.craftfire.odin.managers.OdinManager.loadDatabases(OdinManager.java:206)
com.craftfire.odin.managers.OdinManager.init(OdinManager.java:75)
com.craftfire.odin.layer.bukkit.Odin.onEnable(Odin.java:63)
org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217)
org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:374)
org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:381)
org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:266)
org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:248)
org.bukkit.craftbukkit.CraftServer.<init>(CraftServer.java:200)
net.minecraft.server.ServerConfigurationManagerAbstract.<init>(ServerConfigurationManagerAbstract.java:50)
net.minecraft.server.ServerConfigurationManager.<init>(SourceFile:11)
net.minecraft.server.DedicatedServer.init(DedicatedServer.java:105)
net.minecraft.server.MinecraftServer.run(MinecraftServer.java:377)
net.minecraft.server.ThreadServerApplication.run(SourceFile:539)
---------------------------- STACKTRACE END ----------------------------

Тогда возникает вопрос, почему драйвер DriverManager.getDrivers() не отображается?

Примечание. Я не хочу добавлять библиотеку в CLASSPATH, поэтому мне нужно найти решение проблемы, описанной выше.

И как я могу решить эту проблему? Мне просто нужно загрузить драйвер H2 JDB из фляги.

Я также пробовал это:

  • Не использовать DriverManager.registerDriver(Driver), но вместо этого используйте Class.forName( "org.h2.Driver", true, getClassLoader()), я также попытался использовать .newInstance(), и он не работал.

Может ли кто-нибудь предоставить мне решение?

Спасибо!

Ответ 1

В соответствии с документами Oracle: http://docs.oracle.com/cd/E19501-01/819-3659/beadf/index.html

Classloaders делегируют загрузку классов дочерним загрузчикам классов, ища класс в пути к классам. Тем не менее, URLClassloader, который вы использовали для загрузки вашей библиотеки, не отображается в иерархии системы или начальной загрузки, поэтому он не может найти класс (несмотря на то, что он загружен, хотя и в другой класс... classloader).

Самое простое решение - заменить ваш системный загрузчик классов на URLClassloader и использовать addUrl (... путь...) для загрузки вашей библиотеки, поскольку этот ответ подсказывает: Как я должен загружать Jars динамически во время выполнения?

Ответ 2

Вы должны добавить точное org.h2.Driver файла org.h2.Driver *.jar в org.h2.Driver приложения.

Пример: /home/applications/games/minecraft/drivers/jdbcH2driver.jar

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

Кроме того, он, вероятно, не работает, потому что во время загрузки из сети это может занять некоторое время, и после этого его необходимо скопировать в "правильную папку для classpath приложения", чтобы иметь возможность использовать его и с правильным именем .jar (как в вышеуказанный пункт). Для успешной загрузки "запрос и приложение-операция должны быть помещены в поток", чтобы избежать перебора следующей строки инструкций.

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

Ответ 3

У меня была та же проблема. Драйвер h2 был настроен в pom.xml с помощью

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.193</version>
</dependency>

Потому что я использую Java 6 в своем проекте (не спрашивайте почему;-)), но h2-1.4.193.jar из Репозитория Maven зависит от Java 7, эта версия драйвера не может быть использована.

Изменение pom.xml для использования h2-1.4.190.jar решило проблему для меня.

См. также issue # 300 в проекте h2database git.

Ответ 4

Добавьте H2 JAR в ваш CLASSPATH.

Нет подходящего драйвера, как правило, означает, что синтаксис URL-адреса неверен. Убедитесь, что ваша система соответствует требованиям.

http://www.h2database.com/html/faq.html

Ответ 5

Для меня я получил эту ошибку, используя groovy и grapes для разрешения зависимостей.

Решение:

Вам нужно рассказать винограду использовать systemClassLoader. например.

@GrabConfig(systemClassLoader=true)

Ответ 6

Набор свойств гибернации   значение url для:              JDBC: h2: MEM: тест; DB_CLOSE_DELAY = -1       

driverClassName:

<property name="driverClassName">
<value>org.hibernate.dialect.H2Dialect</value>

Добавьте драйвер H2 в pom:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.3.166</version>
    </dependency>