Java: Pas trouvé de driver jdbc:h2
Je vais avoir un problème avec mon code, j'ai cherché et essayé tout ce que je sais de la, sans un peu de chance.
Scénario:
- Application vérifie si le pilote JDBC existe, dans ce cas, le H2 pilote (org.h2.Le pilote).
- Si elle n'existe pas, l'application télécharge le pilote JDBC et l'ajoute à un chargeur de classe comme suit: (note: storageDataManager est une classe de la mienne je l'ai utiliser pour SQL méthodes)
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) {} }
Lorsque le storageDataManager exécute la première requête, il essaie de se connecter avec le pilote spécifié, et, s'il dispose d'un chargeur de classe, il utilise des chargeurs de classes à la place:
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;
Quand je lance l'application, j'obtiens cette erreur:
"*Ne convient pas trouvé de driver jdbc:h2:les plugins\Odin\data\OdinStorage;AUTO_RECONNECT=TRUE*"
Voici le log complet:
[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 ----------------------------
Ma question est donc, pourquoi ne pas le pilote se présentent dans le DriverManager.getDrivers()?
Remarque: je ne souhaite pas ajouter de la bibliothèque dans le chemin, c'est pourquoi j'ai besoin de trouver une solution pour le problème que j'ai décrit ci-dessus.
Et comment puis-je résoudre ce problème? J'ai simplement besoin de charger le H2 JDB pilote à partir d'un bocal.
J'ai aussi essayé ceci:
- Pas utiliser DriverManager.registerDriver(Pilote), mais l'utilisation de la Classe.forName("org.h2.Pilote", true, getClassLoader()) au lieu de cela, j'ai aussi essayé avec .newInstance(), aucun n'a fonctionné.
Quelqu'un pourrait-il me donner une solution?
Merci!
Je ne souhaite pas ajouter le pilote de mon classpath, c'est pourquoi je suis le téléchargement du pot au lieu de cela, puis essayez de le charger, c'est ce que j'ai besoin d'une solution pour.
Pourquoi ne voulez-vous pas à l'ajouter à classpath?
Vous devez ajouter le fichier JAR au classpath. Cela ne signifie PAS nécessairement la modification de la mondial de la variable d'environnement CLASSPATH. Il y a plusieurs autres façons de le faire.
OriginalL'auteur Contex | 2012-10-16
Vous devez vous connecter pour publier un commentaire.
Selon l'Oracle docs: http://docs.oracle.com/cd/E19501-01/819-3659/beadf/index.html
Chargeurs de classes délégué classloading à l'enfant les chargeurs de classe, à la recherche de la classe sur le chemin de la classe. Cependant, la URLClassloader vous permet de charger votre bibliothèque n'est pas visible pour le système ou d'amorçage de la hiérarchie, de sorte qu'il ne peut pas trouver la classe (malgré qu'il soit chargé, mais d'un autre c...chargeur de classe).
La solution la plus simple est de remplacer votre système de chargeur de classe avec un URLClassloader et l'utilisation addUrl(...chemin...) pour charger votre bibliothèque, que cette réponse suggère: Comment dois-je charger des Pots dynamiquement à l'exécution?
Grâce Afforess, le problème est résolu 🙂
Personnellement, je pense que cette réponse est incorrecte. Je ne suis pas d'accord qu'il est nécessaire d'aller à tout ce mal. Mettre le BOCAL dans votre CLASSPATH et de s'en sortir.
il y a des situations où vous ne pouvez pas à l'ombre des bibliothèques dans votre projet, ou utiliser d'autres connecteurs jdbc. Tout simplement parce que vous ne pas voir un cas d'utilisation ne signifie pas il n'en existe aucune.
Mais vous utilisez le connecteur JDBC pour H2; vous n'avez pas le choix que ce soit. Vous n'êtes pas résoudre quoi que ce soit avec cette solution. Vous êtes tout simplement en ajoutant de la complexité en utilisant un autre chargeur de classe à partir du système. Vous n'avez pas un cas d'utilisation en dehors "je l'ai dit."
OriginalL'auteur Afforess
Vous devez ajouter *l'exacte* org.h2.Pilote .pot de nom de fichier
(exemple nom: /home/applications/games/minecraft/drivers/jdbcH2driver.jar)
pour le classpath de l'application. Afin de décider de l'endroit où le conducteur sera toujours dans votre application et de trouver l'application à la maison chemin du dossier de construire complètement lorsqu'une application utilisant il est déjà installé.
Aussi, il n'a probablement pas fonctionner, car lors de téléchargement depuis le net, il peut prendre du temps et après doivent être copiés dans le "dossier correct pour le classpath de l'application" pour pouvoir l'utiliser, et avec la bonne .pot de nom(comme dans le paragraphe ci-dessus).
Pour télécharger "de la requête et de la demande-l'opération doit être mis dans un thread" pour prévenir overun à la ligne suivante d'instructions.
Sensiblement, au lancement de l'application vous serait de vérifier l' .pot était présent et le télécharger s'il n'était pas présent et installé tout délivrance d'un avertissement à l'utilisateur de le télécharger si l' .pot n'était pas présent.
OriginalL'auteur nicephotog
J'ai eu le même problème. Le h2 pilote a été configuré dans le pom.xml avec
Parce que j'utilise la version 6 de Java dans mon projet (ne me demandez pas pourquoi ;-)) mais le h2-1.4.193.jar depuis le Repository Maven dépend de Java 7, cette version du pilote n'a pas pu être utilisé.
La modification de la pom.xml pour utiliser h2-1.4.190.jar résolu le problème pour moi.
Voir aussi question n ° 300 dans le h2database projet git.
OriginalL'auteur Erik_A
Ajouter le H2 BOCAL à votre CLASSPATH.
Aucun pilote approprié signifie généralement que la syntaxe de l'URL est incorrecte. Assurez-vous que le vôtre est conforme.
http://www.h2database.com/html/faq.html
Vous n'avez pas le choix, et je ne vois pas pourquoi vous ne voulez pas ajouter H2 BOCAL à votre CLASSPATH. C'est la façon dont Java fonctionne.
OriginalL'auteur duffymo
Pour moi, j'ai eu cette erreur à l'aide de
groovy
etgrapes
pour la résolution des dépendances.La solution:
Vous devez dire aux raisins à utiliser le systemClassLoader. par exemple,
OriginalL'auteur Nick Grealy
Hibernate définir les propriétés d'
url de la valeur à:
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
driverClassName:
Ajouter H2 pilote de pom:
OriginalL'auteur dafali