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

Java:未找到适合jdbc:h2的驱动程序,java,jdbc,classloader,h2,Java,Jdbc,Classloader,H2,我的一些代码有问题,我已经搜索并尝试了所有我知道的东西,没有任何运气 场景: 应用程序检查JDBC驱动程序是否存在,在本例中是H2驱动程序(org.H2.driver) 如果它不存在,应用程序将下载JDBC驱动程序并将其添加到类加载器中,如下所示:(注意:storageDataManager是我用于SQL方法的一个类) 当storageDataManager运行第一个查询时,它会尝试连接指定的驱动程序,如果它确实有一个类加载器,它会使用类加载器: if (getClassLoader(

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


场景:

  • 应用程序检查JDBC驱动程序是否存在,在本例中是H2驱动程序(org.H2.driver)
  • 如果它不存在,应用程序将下载JDBC驱动程序并将其添加到类加载器中,如下所示:(注意:storageDataManager是我用于SQL方法的一个类)


当storageDataManager运行第一个查询时,它会尝试连接指定的驱动程序,如果它确实有一个类加载器,它会使用类加载器:

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 ----------------------------
[Debug]加载H2驱动程序的自定义类加载器:java.net。URLClassLoader@3bf3d5f4
[调试]加载的H2驱动程序:org.H2。Driver@67257ce8 - 3 - 1
[调试]检查DriverManager驱动程序。
[调试]找到驱动程序#1:sun.jdbc.odbc.JdbcOdbcDriver
[Debug]找到驱动程序#2:com.mysql.jdbc.driver
[Debug]在DriverManager中找到2个驱动程序。
---------------------------堆栈跟踪错误---------------------------
类名:java.sql.DriverManager
错误消息:找不到适合jdbc的驱动程序:h2:plugins\Odin\data\OdinStorage;自动重新连接=真
错误原因:空
文件名:null
函数名称:getConnection
错误行:-1
---------------------------堆栈跟踪启动---------------------------
java.sql.DriverManager.getConnection(未知源)
java.sql.DriverManager.getConnection(未知源)
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)
StorageManager.(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.oneable(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)
craftbukkit.CraftServer。(CraftServer.java:200)
net.minecraft.server.ServerConfigurationManagerAbstract.(ServerConfigurationManagerAbstract.java:50)
net.minecraft.server.ServerConfigurationManager。(源文件:11)
net.minecraft.server.indivatedServer.init(indivatedServer.java:105)
net.minecraft.server.MinecraftServer.run(MinecraftServer.java:377)
net.minecraft.server.ThreadServerApplication.run(源文件:539)
----------------------------堆栈跟踪端----------------------------
我的问题是,为什么驱动程序不出现在DriverManager.getDrivers()中

注意:我不希望将库添加到类路径,这就是为什么我需要找到解决上述问题的方法

我怎样才能解决这个问题?我只需要从jar加载H2JDB驱动程序

我也试过:

  • 不要使用DriverManager.registerDriver(驱动程序),而是使用Class.forName(“org.h2.Driver”,true,getClassLoader()),我也尝试过使用.newInstance(),两者都不起作用
有谁能给我一个解决办法吗


谢谢

将H2 JAR添加到类路径中

没有合适的驱动程序通常意味着URL语法不正确。检查以确保您的符合要求


根据Oracle文档:

类装入器将类装入委托给子类装入器,在类路径上搜索类。但是,用于加载库的URLClassloader对系统或引导层次结构不可见,因此它找不到该类(尽管它正在加载,但在另一个castl…classloader中)


最简单的解决方案是用URLClassloader替换系统类加载器,并使用addUrl(…path…)加载库,正如这个答案所建议的:

您必须将确切的
org.h2.Driver
*.jar文件名添加到应用程序的类路径中

示例
/home/applications/games/minecraft/drivers/jdbcH2driver.jar

因此,请确定驱动程序将始终位于应用程序中的何处,并找到应用程序主文件夹路径,以便在安装使用它的应用程序时完全构建它

此外,它可能无法运行,因为在从网络下载的过程中,它可能需要时间,并且必须在下载后复制到“应用程序的类路径的正确文件夹”中,以便能够使用它并使用正确的.jar名称(如上段所述)。 要成功下载“查询和应用程序操作应放在一个线程中”,以防止过度运行到下一行指令


明智地说,在应用程序启动时,您会检查.jar是否存在,如果它不存在并已安装,则下载它,同时向用户发出警告,如果.jar不存在,则下载它。

对于我来说,我是使用
groovy
grapes
来解决依赖关系的

解决方案: 您需要告诉grapes使用systemClassLoader。e、 g

@GrabConfig(systemClassLoader=true)
休眠属性集 url值到: jdbc:h2:mem:test;DB_关闭_延迟=-1

driverClassName:

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

org.hibernate.dial.h2方言

将H2驱动程序添加到pom:

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

com.h2数据库
氢
1.3.166

我也有同样的问题。h2驱动程序已在pom中配置。
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.3.166</version>
    </dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.193</version>
</dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.200</version>
        <scope>test</scope>
    </dependency>
dependencies {
    implementation("com.h2database:h2:1.4.199")
..
}