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!

Le fichier JAR est de H2 dans votre classpath?
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