2012-05-17 6 views
17

Ich habe 2 Java-Web-Anwendungen, die eine Verbindung zur SQL Server-Datenbank mit Windows integrierte Authentifizierung herstellen müssen.Native Bibliothek sqljdbc_auth.dll bereits in einem anderen Klassenlader geladen

Die erste, die geladen wird, funktioniert gut, aber der zweite wirft die Ausnahme:

Native Library sqljdbc_auth.dll already loaded in another classloader 

Der obige Fehler tritt auf, wenn ich die sqljdbc_auth.dll in einem der Ordner platzieren:

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

Wenn ich stelle die sqljdbc_auth.dll in einem der Ordner unter:

  • /WEB-INF/lib jeder Web-Anwendung
  • C: \ Programme \ Apache Software Foundation \ Tomcat 7.0 \ lib \

Beiden Anwendungen werfen die Ausnahme:

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

ich diesen Code verwenden den Treiber zu laden:

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

Wie kann ich es lösen?

Antwort

26

Jede Webanwendung hat ihren eigenen Classloader (isoliert diese). Wenn Sie die Class.forName() -Methode aufrufen, gibt es einen statischen Block, der versucht, die gemeinsam genutzte Bibliothek (DLL-Datei) zu laden - also versuchen beide Web-Apps, die freigegebene Lib zu laden, daher die Fehlermeldung beim zweiten Versuche zu laden.

Die JDBC-jar Sie Sqlserver haben sollte verhindert werden, gebündelt mit dem Krieg, in die tomcat 7.0/lib Ordner und kopieren Sie die sqljdbc_auth.dll zu tomcat/bin-Ordner verschoben werden - auf diese Weise in dem tomcat Eltern Classloader sein wird, und die Die Klasse wird nur einmal geladen.

|----------------------------------| 
| sqljdbc*.jar  --> tomcat*/lib | 
|----------------------------------| 
| sqljdbc_auth.dll --> tomcat*/bin | 
|----------------------------------| 
+0

Wie ich in meiner Frage gesagt habe, habe ich versucht, die DLL in tomcat 7.0/lib vor zu stellen. Nach deiner Antwort habe ich den Tomcat 7.0/lib * s * erstellt und die DLL dorthin gelegt, und ich habe denselben Fehler bekommen: Fehler beim Laden der sqljdbc_auth.dll Ursache: - nein sqljdbc_auth in java.library.path – Gustavo

+0

I ' lese über den Tomcat Classloader vorher in den Link: http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html Aber es scheint, dass der Tomcat nur die .jar-Dateien lädt nicht die .dll-Dateien. – Gustavo

+1

Ok, um klar zu stellen, müssen Sie die DLL in den Tomcat/bin-Ordner und die JDBC ** JAR ** Datei in den Tomcat/lib-Ordner (Entschuldigung mein Fehler auf der zusätzlichen s Lib, die ich jetzt korrigiert haben)) –

1

Ich denke, Sie sind auf dem richtigen Weg.

Für Startbefehlszeile Sie, indem Sie die Umgebungsvariable

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

Wenn Sie tomcat als Dienst ausgeführt wird, ändern Sie die Optionen der keine sqljdbc_auth in java.library.path Problem leicht lösen können Parameter unter

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

enthalten:

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

Danke für die Antwort, aber die vorherige hat das Problem gelöst. – Gustavo

0

Derselbe Fehler tritt in Jasper Studio auf.

Wahrscheinlich nicht die beste Lösung, aber legen Sie die Datei sqljdbc4.jar in C: \ Programme (x86) \ TIBCO \ Jaspersoft Studio-6.1.0.final \ features \ jre.win32.win32.x86.feature_1.7.0 ab.u80 \ jre \ lib \ ext und die Datei sqljdbc_auth.dll in C: \ Programme (x86) \ TIBCO \ Jaspersoft Studio-6.1.0.final \ features \ jre.win32.win32.x86.feature_1.7.0.u80 \ jre \ bin

Und es wird funktionieren.