Java: Kein geeigneter Treiber für jdbc: h2 gefunden

8

Ich habe ein Problem mit etwas von meinem Code, ich habe alles, was ich weiß, ohne Glück durchsucht und versucht.

Szenario:

  • Die Anwendung prüft, ob der JDBC-Treiber vorhanden ist, in diesem Fall der H2-Treiber (org.h2.Driver).
  • Wenn es nicht existiert, lädt die Anwendung den JDBC-Treiber herunter und fügt ihn einem ClassLoader wie folgt hinzu: ( Anmerkung : storageDataManager ist eine Klasse von mir, die ich für SQL-Methoden verwende)

    %Vor%

Wenn der storageDataManager die erste Abfrage ausführt, versucht er, eine Verbindung mit dem angegebenen Treiber herzustellen. Wenn er einen ClassLoader hat, verwendet er stattdessen ClassLoader:

%Vor%

Wenn ich die Anwendung starte, bekomme ich diesen Fehler:

"* Kein geeigneter Treiber für jdbc gefunden: h2: plugins \ Odin \ data \ OdinStorage; AUTO_RECONNECT = TRUE *"

Hier ist das vollständige Protokoll:

%Vor%

Meine Frage ist dann, warum erscheint der Treiber nicht im DriverManager.getDrivers ()?

Hinweis: Ich möchte die Bibliothek nicht dem CLASSPATH hinzufügen, weshalb ich eine Lösung für das oben beschriebene Problem finden muss.

Und wie kann ich dieses Problem lösen? Ich muss einfach den H2 JDB Treiber aus einem Jar laden.

Ich habe es auch versucht:

  • Verwenden Sie nicht DriverManager.registerDriver (Driver), aber verwenden Sie stattdessen Class.forName ("org.h2.Driver", true, getClassLoader ()), ich habe es auch mit .newInstance () versucht, beides hat nicht funktioniert.

Könnte mir jemand eine Lösung dafür anbieten?

Danke!

    
Contex 16.10.2012, 17:20
quelle

6 Antworten

4

Laut den Oracle-Dokumenten: Ссылка

Classloaders delegieren das Klassenladen an untergeordnete Klassenlader, wobei nach der Klasse im Klassenpfad gesucht wird. Der URLClassloader, den Sie zum Laden Ihrer Bibliothek verwendet haben, ist jedoch für die System- oder Bootstrap-Hierarchie nicht sichtbar, sodass er die Klasse nicht finden kann (obwohl sie geladen wurde, wenn auch in einem anderen Castl ... Classloader).

Die einfachste Lösung ist, Ihren Systemklassenlader durch einen URLClassloader zu ersetzen und addUrl (... path ...) zu verwenden, um Ihre Bibliothek zu laden, wie diese Antwort vorschlägt: Wie sollte ich Jars dynamisch zur Laufzeit laden?

    
Afforess 16.10.2012, 18:45
quelle
1

Sie müssen * den genauen * org.h2.Driver .jar-Dateinamen hinzufügen ( Beispielname: /home/applications/games/minecraft/drivers/jdbcH2driver.jar ) zum Klassenpfad der Anwendung. Entscheiden Sie also, wo sich der Treiber immer in Ihrer Anwendung befindet, und suchen Sie den Home-Pfad der Anwendung, um ihn vollständig zu erstellen, wenn eine Anwendung, die ihn verwendet, jemals installiert wird.

Auch funktioniert es wahrscheinlich nicht, weil es beim Herunterladen aus dem Netz einige Zeit dauern kann und danach in den "richtigen Ordner für den Klassenpfad der Anwendung" kopiert werden muss, um es verwenden zu können und mit dem richtigen .jar-Namen (wie im obigen Absatz). Um die "Abfrage- und Anwendungsoperation erfolgreich herunterzuladen, sollte sie in einen Thread eingefügt werden", um zu verhindern, dass die nächste Befehlszeile überschrieben wird.

Sinnvollerweise sollten Sie beim Start der Anwendung prüfen, ob das .jar vorhanden ist, und es herunterladen, falls es nicht vorhanden und installiert war, und dem Benutzer eine Warnung ausgeben, es herunterzuladen, falls die .jar nicht vorhanden war.

    
nicephotog 16.10.2012 18:46
quelle
0

Fügen Sie das H2 JAR zu Ihrem CLASSPATH hinzu.

Kein geeigneter Treiber bedeutet normalerweise, dass die URL-Syntax falsch ist. Überprüfen Sie, ob Ihre Anforderungen erfüllt sind.

Ссылка

    
duffymo 16.10.2012 17:23
quelle
0

Für mich habe ich diesen Fehler mit groovy und grapes für die Auflösung der Abhängigkeit erhalten.

Die Lösung:

Sie müssen den Trauben mitteilen, dass sie den systemClassLoader verwenden sollen. z.B.

%Vor%     
Nick Grealy 20.11.2014 04:52
quelle
0

Ruhezustandseigenschaften festgelegt     URL-Wert für:                  jdbc: h2: mem: test; DB_CLOSE_DELAY = -1         

driverClassName:

%Vor%

Füge H2-Treiber zu pom hinzu:

%Vor%     
dafali 17.12.2014 09:33
quelle
0

Ich hatte das gleiche Problem. Der h2-Treiber wurde in der pom.xml mit

konfiguriert %Vor%

Weil ich Java 6 in meinem Projekt verwende (frag nicht warum ;-)), aber die h2-1.4.193.jar aus dem Maven Repository hängt von Java 7 ab, diese Treiberversion konnte nicht verwendet werden.

Das Ändern der pom.xml zur Verwendung von h2-1.4.190.jar hat das Problem für mich gelöst.

Siehe auch Problem # 300 im h2database git-Projekt.

    
Erik_A 05.12.2016 15:06
quelle

Tags und Links