gpt4 book ai didi

Java:找不到适合 jdbc:h2 的驱动程序

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:24 30 4
gpt4 key购买 nike

我的一些代码有问题,我已经搜索并尝试了我所知道的一切,但没有任何运气。


场景:

  • 应用程序检查 JDBC 驱动程序是否存在,在本例中为 H2 驱动程序 (org.h2.Driver)。
  • 如果它不存在,应用程序将下载 JDBC 驱动程序并将其添加到类加载器中,如下所示:(注意: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 运行第一个查询时,它会尝试连接指定的驱动程序,如果它确实有 ClassLoader,它会改用 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:plugins\Odin\data\OdinStorage 的驱动程序;AUTO_RECONNECT=TRUE*”

这是完整的日志:

[Debug] Loading custom class loader for H2 driver: java.net.URLClassLoader@3bf3d5f4
[Debug] Loaded H2 driver: org.h2.Driver@67257ce8 - 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,这就是为什么我需要找到解决上述问题的方法。

我该如何解决这个问题?我只需要从 jar 加载 H2 JDB 驱动程序。

我也试过这个:

  • 不使用 DriverManager.registerDriver(Driver),而是使用 Class.forName("org.h2.Driver", true, getClassLoader()),我也尝试过使用 .newInstance(),但都没有用。

谁能给我提供解决方案?

谢谢!

最佳答案

根据 Oracle 文档:http://docs.oracle.com/cd/E19501-01/819-3659/beadf/index.html

类加载器将类加载委托(delegate)给子类加载器,在类路径中搜索类。但是,您用来加载库的 URLClassloader 对系统或 Bootstrap 层次结构不可见,因此它找不到该类(尽管它正在加载,尽管在另一个 caSTL...类加载器中)。

最简单的解决方案是用 URLClassloader 替换您的系统类加载器,并使用 addUrl(...path...) 加载您的库,正如这个答案所建议的:How should I load Jars dynamically at runtime?

关于Java:找不到适合 jdbc:h2 的驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920151/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com