Java: No suitable driver found for jdbc:h2
Ich habe ein Problem mit einigen von meinem code habe ich gesucht und alles versucht, was ich kenne, ohne Glück.
Szenario:
- Anwendung überprüft, ob die JDBC-Treiber vorhanden ist, in diesem Fall der H2-Treiber (org.h2.Fahrer).
-
Wenn es nicht existiert, wird die Applikation lädt den JDBC-Treiber und fügt es zu einem ClassLoader in etwa so: (Hinweis: storageDataManager ist eine Klasse von mir, die ich verwenden für SQL-Methoden)
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) {} }
Wenn die storageDataManager läuft die erste Abfrage, versucht es, eine Verbindung mit dem angegebenen Treiber, und wenn es das tut haben ein ClassLoader verwendet es ClassLoader statt:
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;
Wenn ich die Anwendung ausführen bekomme ich diese Fehlermeldung:
"*No suitable driver found for jdbc:h2:plugins\Odin\data\OdinStorage;AUTO_RECONNECT=TRUE*"
Hier ist das komplette log:
[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 ----------------------------
Meine Frage ist dann, warum nicht die Fahrer zeigen, bis in der DriverManager.getDrivers()?
Hinweis: ich nicht wollen, fügen Sie die Bibliothek zum CLASSPATH, das ist, warum ich brauchen, um zu finden eine Lösung für das Problem, das ich oben beschrieben.
Und wie kann ich dieses Problem lösen? Ich brauche einfach das laden der H2-JDB-Fahrer aus einem Glas.
Habe ich auch so probiert:
- Nicht verwenden DriverManager.registerDriver(Treiber), aber Klasse.forName("org.h2.Treiber", true, getClassLoader()) statt, ich hab auch schon versucht mit .newInstance(), die weder arbeitete.
Könnte jemand mir eine Lösung?
Dank!
- Ist die JAR-Datei für die H2 in den classpath?
- Ich möchte nicht hinzufügen, um den Treiber zu meinem classpath, das ist, warum ich bin das herunterladen der jar statt und dann versuchen, es zu laden, das ist das, was ich brauchen eine Lösung für.
- Warum wollen Sie nicht, um es in classpath?
- Sie müssen fügen Sie die JAR-Datei dem classpath. Dies bedeutet NICHT notwendigerweise die änderung der globalen KLASSENPFAD-Umgebungsvariable. Es gibt mehrere andere Möglichkeiten, es zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gemäß den Oracle-docs: http://docs.oracle.com/cd/E19501-01/819-3659/beadf/index.html
Classloadern Delegierten zum laden von Klassen zu Kind classloadern, Suche für die Klasse auf dem Klassenpfad. Jedoch, der URLClassloader, die Sie verwendet, um laden Sie Ihre Bibliothek ist nicht im system sichtbar oder bootstrap-Hierarchie, also kann es nicht die Klasse zu finden, (obwohl es geladen wird, wenn auch in einem anderen castl...classloader).
Die einfachste Lösung ist, ersetzen Sie Ihre system-classloader mit einem URLClassloader, und verwenden Sie addUrl(...Pfad...) zu laden Sie Ihre Bibliothek, wie es diese Antwort suggeriert: Wie soll ich laden Jars zur Laufzeit dynamisch?
Ich hatte das gleiche problem. Der h2-Treiber konfiguriert wurde, in der pom.xml mit
Denn ich bin mit Java 6 in meinem Projekt (bitte nicht Fragen warum ;-)) aber die h2-1.4.193.jar aus dem Maven-Repository, hängt von Java 7, die diese Treiber-version nicht verwendet werden konnte.
Ändern pom.xml verwenden h2-1.4.190.jar das problem bei mir gelöst.
Siehe auch Ausgabe #300 in der h2database git Projekt.
Hibernate-Eigenschaften festlegen
url Wert:
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
driverClassName:
Hinzufügen H2-Treiber zu pom:
Müssen Sie die genaue
org.h2.Driver
*.jar-Datei-Namen im classpath der Anwendung.Beispiel:
/home/applications/games/minecraft/drivers/jdbcH2driver.jar
Also entscheiden, wo der Fahrer wird immer in Ihrer Anwendung und finden Sie die Anwendung home-Ordner-Pfad, um es zu konstruieren vollständig, wenn eine Anwendung, die es jemals installiert.
Auch, das es wohl nicht funktionieren, da beim download aus dem Netz kann es einige Zeit dauern und nach kopiert werden muss, in die "richtige Ordner für den Klassenpfad der Anwendung" in der Lage sein, es zu benutzen und mit der richtigen .jar-name(wie im obigen Absatz).
Für einen erfolgreichen download der "Abfrage-und Anwendungs-Betrieb gelegt werden sollte in einem thread" um zu verhindern, dass overun auf die nächste Zeile der Anweisungen.
Sinnvoll, auf Anwendung starten, würden Sie die .jar war auch zugegen, und download es, wenn es nicht anwesend war und installiert, während verlegerung eine Warnung an den Benutzer, um es herunterzuladen, wenn die .jar war nicht vorhanden.
Fügen Sie den H2-JAR in den CLASSPATH.
Keine passenden Treiber in der Regel bedeutet, dass die URL-syntax ist falsch. Stellen Sie sicher, dass ihrigen entspricht.
http://www.h2database.com/html/faq.html
Für mich, ich habe diesen Fehler mit
groovy
undgrapes
für die Auflösung von Abhängigkeiten.Die Lösung:
Müssen Sie mitteilen Trauben zu verwenden, der systemClassLoader. z.B.