簡體   English   中英

Java:沒有為jdbc:h2找到合適的驅動程序

[英]Java: No suitable driver found for jdbc:h2

我的一些代碼存在問題,我搜索並嘗試了我所知道的一切,沒有任何運氣。


場景:

  • 應用程序檢查是否存在JDBC驅動程序,在本例中為H2驅動程序(org.h2.Driver)。
  • 如果它不存在,應用程序將下載JDBC驅動程序並將其添加到ClassLoader,如下所示:( 注意 :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

類加載器將類加載委托給子類加載器,在類路徑上搜索類。 但是,用於加載庫的URLClassloader對於系統或引導層次結構是不可見的,因此它無法找到該類(盡管它已被加載,盡管在另一個castl ...類加載器中)。

最簡單的解決方案是用URLClassloader替換你的系統類加載器並使用addUrl(... path ...)加載你的庫,因為這個答案表明: 我應該如何在運行時動態加載Jars?

我有同樣的問題。 h2驅動程序是在pom.xml中配置的

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

因為我在我的項目中使用Java 6(不要問為什么;-))但是來自Maven Repository的h2-1.4.193.jar依賴於Java 7,因此無法使用此驅動程序版本。

更改pom.xml以使用h2-1.4.190.jar解決了我的問題。

另請參閱h2database git項目中的問題#300

您必須將完整的 org.h2.Driver * .jar文件名添加到應用程序的類路徑中。

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

因此,確定驅動程序始終位於應用程序中的位置,並找到應用程序主文件夾路徑,以便在安裝使用它的應用程序時完全構建它。

此外,它可能無法運行,因為從網上下載時需要花費時間,之后必須復制到“應用程序類路徑的正確文件夾”才能使用它並使用正確的.jar名稱(如上段)。 要成功下載“查詢和應用程序操作應放在一個線程中”,以防止超出下一行指令。

明智地,在應用程序啟動時,您將檢查.jar是否存在並下載它(如果它不存在並安裝),同時向用戶發出警告,如果.jar不存在則下載它。

Hibernate屬性將url值設置為:jdbc:h2:mem:test; 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>

將H2 JAR添加到CLASSPATH中。

沒有合適的驅動程序通常意味着URL語法不正確。 檢查以確保您的順從。

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

對我來說,我使用groovygrapes來解決這個錯誤。

解決方案:

你需要告訴葡萄使用systemClassLoader。 例如

@GrabConfig(systemClassLoader=true)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM