13

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


シナリオ:

  • アプリケーションは、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()を試してみましたが、どちらも機能しませんでした。

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

ありがとう!

4

8 に答える 8

5

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

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

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

于 2012-10-16T18:45:51.460 に答える
3

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

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

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

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

h2database gitプロジェクトの問題#300も参照してください。

于 2016-12-05T15:06:55.247 に答える
1

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

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

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

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

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

于 2012-10-16T18:46:32.503 に答える
1

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>
于 2014-12-17T09:33:08.913 に答える
1

私の場合、エラーはMavenスコープにありました

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.200</version>
        <scope>test</scope>
    </dependency>

削除するか、表示可能なスコープに変更すると、機能しました

于 2021-02-26T12:56:27.133 に答える
0

H2JARをCLASSPATHに追加します。

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

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

于 2012-10-16T17:23:14.640 に答える
0

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

ソリューション:

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

@GrabConfig(systemClassLoader=true)
于 2014-11-20T04:52:00.603 に答える
0

Kotlinプロジェクトでも同じ問題が発生しました。bild.gradle.ktsに追加しました

dependencies {
    implementation("com.h2database:h2:1.4.199")
..
}

その後、IntelliJファイル->キャッシュの無効化で。

于 2021-05-05T13:31:16.283 に答える