Ich habe ein Problem mit etwas von meinem Code, ich habe alles, was ich weiß, ohne Glück durchsucht und versucht.
Szenario:
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:
Könnte mir jemand eine Lösung dafür anbieten?
Danke!
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?
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.
Für mich habe ich diesen Fehler mit groovy
und grapes
für die Auflösung der Abhängigkeit erhalten.
Sie müssen den Trauben mitteilen, dass sie den systemClassLoader verwenden sollen. z.B.
%Vor%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.
Tags und Links java classloader jdbc h2