У меня возникла проблема с некоторыми из моего кода, я искал и пробовал все, что я знаю, без везения.
Сценарий:
- Приложение проверяет, существует ли драйвер 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(), и он не работал.
Может ли кто-нибудь предоставить мне решение?
Спасибо!