web-dev-qa-db-ja.com

Java:jdbc:h2に適したドライバーが見つかりません

コードの一部に問題があります。運が悪かったので、知っていることをすべて検索して試しました。


シナリオ:

  • アプリケーションは、JDBCドライバー(この場合はH2ドライバー(org.h2.Driver))が存在するかどうかを確認します。
  • 存在しない場合、アプリケーションはJDBCドライバーをダウンロードし、次のようにClassLoaderに追加します。(:storageDataManagerは、SQLメソッドに使用する私のクラスです)

       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) {}
        }
    

StorageDataManagerが最初のクエリを実行すると、指定されたドライバーとの接続を試みます。ClassLoaderがある場合は、代わりにClassLoaderを使用します。

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;

アプリケーションを実行すると、次のエラーが発生します。

"* jdbc:h2:plugins\Odin\data\OdinStorage; AUTO_RECONNECT = TRUE *に適したドライバーが見つかりません"

完全なログは次のとおりです。

[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 ----------------------------

私の質問は、なぜドライバーがDriverManager.getDrivers()に表示されないのですか?

注:ライブラリをCLASSPATHに追加したくないので、上記の問題の解決策を見つける必要があります。

そして、どうすればこの問題を解決できますか? jarからH2JDBドライバーをロードするだけです。

私もこれを試しました:

  • DriverManager.registerDriver(Driver)を使用せず、代わりにClass.forName( "org.h2.Driver"、true、getClassLoader())を使用します。newInstance()も試してみましたが、どちらも機能しませんでした。

誰かが私にこれに対する解決策を提供できますか?

ありがとう!

11
Contex

Oracleのドキュメントによると: http://docs.Oracle.com/cd/E19501-01/819-3659/beadf/index.html

クラスローダーは、クラスロードを子クラスローダーに委任し、クラスパスでクラスを検索します。ただし、ライブラリのロードに使用したURLClassloaderは、システムまたはbootstrap階層に表示されないため、クラスを見つけることができません(別のcastl ... classloaderにあるにもかかわらず、ロードされているにもかかわらず) )。

最も簡単な解決策は、システムクラスローダーをURLClassloaderに置き換え、addUrl(... path ...)を使用してライブラリをロードすることです。この回答が示すように: 実行時にJarを動的にロードするにはどうすればよいですか?

5
Afforess

私も同じ問題を抱えていました。 h2ドライバーはpom.xmlで次のように構成されました

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.193</version>
</dependency>

私はプロジェクトでJava 6を使用しています(理由は聞かないでください;-))ですが、Mavenリポジトリのh2-1.4.193.jarはJava 7、このドライバーバージョンは使用できませんでした。

H2-1.4.190.jarを使用するようにpom.xmlを変更すると、問題が解決しました。

H2database gitプロジェクトの issue#3 も参照してください。

3
Erik_A

HibernateプロパティはURL値を次のように設定します:jdbc:h2:mem:test; DB_CLOSE_DELAY = -1

driverClassName:

<property name="driverClassName">
<value>org.hibernate.dialect.H2Dialect</value>

H2ドライバーをpomに追加します。

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.3.166</version>
    </dependency>
1
dafali

追加する必要があります正確org.h2.Driver * .jarファイル名からアプリケーションのクラスパスへ。

/home/applications/games/minecraft/drivers/jdbcH2driver.jar

したがって、ドライバーが常にアプリケーションのどこにあるかを決定し、それを使用するアプリケーションがインストールされたときに完全に構​​築するためのアプリケーションのホームフォルダーパスを見つけます。

また、ネットからのダウンロード中に時間がかかる可能性があり、その後、正しい.jar名で使用できるようにするには、「アプリケーションのクラスパスの正しいフォルダ」にコピーする必要があるため、おそらく動作しません(上記の段落)。正常にダウンロードするには、「クエリとアプリケーション操作をスレッドに入れる必要があります」をダウンロードして、次の行の命令にオーバーアンしないようにします。

賢明なことに、アプリケーションの起動時に、.jarが存在することを確認し、存在しない場合はダウンロードしてインストールし、.jarが存在しない場合はダウンロードするようにユーザーに警告します。

1
nicephotog

H2JARをCLASSPATHに追加します。

適切なドライバがないということは、通常、URL構文が正しくないことを意味します。準拠していることを確認してください。

http://www.h2database.com/html/faq.html

0
duffymo

私の場合、依存関係の解決にgroovygrapesを使用してこのエラーが発生しました。

ソリューション:

SystemClassLoaderを使用するようにブドウに指示する必要があります。例えば.

@GrabConfig(systemClassLoader=true)
0
Nick Grealy