web-dev-qa-db-ja.com

ネイティブライブラリsqljdbc_auth.dllはすでに別のクラスローダーにロードされています

Windows統合認証を使用してSQL Serverデータベースに接続する必要がある2 Java Webアプリがあります。

ロードされた最初のものは正常に動作しますが、2番目のものは例外をスローします。

Native Library sqljdbc_auth.dll already loaded in another classloader

上記のエラーは、sqljdbc_auth.dllをいずれかのフォルダに配置すると発生します。

  • C:\ WINDOWS\system32 \
  • C:\ Program Files\Apache Software Foundation\Tomcat 7.0\bin \

Sqljdbc_auth.dllを次のいずれかのフォルダに配置すると、

  • 各Webアプリケーションの/ WEB-INF/libディレクトリ
  • C:\ Program Files\Apache Software Foundation\Tomcat 7.0\lib \

どちらのアプリも例外をスローします。

Failed to load the sqljdbc_auth.dll cause :- no sqljdbc_auth in Java.library.path

このコードを使用してドライバーをロードしています:

Class.forName("jdbc:sqlserver://<Host>;databaseName=<DBNAME>;integratedSecurity=true;");

どうすれば解決できますか?

21
Gustavo

各Webアプリケーションには独自のクラスローダーがあります(それらを分離します)。 Class.forName()メソッドを呼び出すと、共有ライブラリ(dllファイル)をロードしようとしている静的ブロックがあるため、両方のWebアプリが共有ライブラリをロードしようとしているため、2つ目のエラーメッセージがロードしようとします。

Sqlserver用に持っているJDBC jarは、warにバンドルされているものからTomcat 7.0/libフォルダーに移動し、sqljdbc_auth.dllをTomcat/binフォルダーにコピーする必要があります。これにより、Tomcat親クラスローダーと、クラスは一度だけロードされます。

|----------------------------------|
| sqljdbc*.jar     --> Tomcat*/lib |
|----------------------------------|
| sqljdbc_auth.dll --> Tomcat*/bin |
|----------------------------------|
31
Chris White

私はあなたが正しい軌道に乗っていると思います。

コマンドライン起動の場合、環境変数を設定することでJava.library.pathにsqljdbc_authがない問題を簡単に解決できます

CATALINA_OPTS=-Djava.library.path=/path/to/dll

Tomcatをサービスとして実行している場合は、Optionsパラメータを

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java

含める:

-Djava.library.path=/path/to/dll
1
pd40

Jasper Studioでも同じエラーが発生します。

おそらく最良の解決策ではありませんが、sqljdbc4.jarをC:\ Program Files(x86)\ TIBCO\Jaspersoft Studio-6.1.0.final\features\jre.win32.win32.x86.feature_1.7.0.u80\jre \に配置しますC:\ Program Files(x86)\ TIBCO\Jaspersoft Studio-6.1.0.final\features\jre.win32.win32.x86.feature_1.7.0.u80\jre\binにあるlib\extおよびsqljdbc_auth.dll

そしてそれはうまくいきます。

0