2015-12-10 8 views
10

Ich habe ein Web-Entwicklungsprojekt mit lokaler Installation von Tomcat 7. Ich versuche, eine Verbindung zu SQL Server 2012 mit Microsoft Treiber für jdbc (sqljdbc41.jar).ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver

Die sqljdbc41.jar ist in meiner Anwendung Build-Pfad:

enter image description here

und ich bin exportieren. Außerdem habe ich im Tomcat-Anwendungsverzeichnis lib Ordner auch eine Kopie von sqljdbc41.jar platziert.

Es gibt keine Kompilierung Fehler, aber zur Laufzeit, wenn ich versuche, die SQL Server-Treiber ich folgende erhalten zu laden:

ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver 

Die Ausnahme wird im folgenden Code-Block geworfen:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
String connectionUrl = "jdbc:sqlserver://"+server+":1433;databaseName="+database+";user=sa;password="+password+";"; 
con = (Connection) DriverManager.getConnection(connectionUrl); 

ich ohne eine Entscheidung zu diesem Thema viele Beiträge gesehen:

  1. java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver : Am I loading the right driver?
  2. https://social.msdn.microsoft.com/Forums/sqlserver/en-US/b425c201-9882-4a48-b049-4004f202b0c6/javalangclassnotfoundexception-commicrosoftsqlserverjdbcsqlserverdriver?forum=sqldataaccess
  3. Getting ClassNotFoundException on code: "Class.forName("com.microsoft.sqlserver.jdbc.SqlServerDriver");"

und vieles mehr.

Compiler Ebene 1.7 und eine JRE von 1.7 - Nach documentation glaube ich, dass ich den richtigen Treiber verwende. Dies besagt auch, dass der CLASSPATH festgelegt werden muss:

echo $CLASSPATH 
/var/common/sqljdbc41.jar 

Welche es ist. Außerdem:

java -version 
java version "1.7.0_75" 
Java(TM) SE Runtime Environment (build 1.7.0_75-b13) 
Java HotSpot(TM) 
64-Bit Server VM (build 24.75-b04, mixed mode) 

Also, warum bin ich immer noch dabei ???

aktualisieren

ich die sqljdbc41.jar von Microsoft erneut heruntergeladen - nur um sicher zu sein, dass irgendwie das erste Glas nicht beschädigt war.

Nach dem Link von Mick Mnemonic habe ich das Jar aus dem Java-Build-Pfad entfernt und das neu heruntergeladene JAR in den Ordner WEB-INF/lib der Webanwendung gestellt. Ich habe dann Eclipse und den Tomcat-Server neu gestartet und den Tomcat-Server und das Projekt gesäubert.

Immer noch die ClassNotFoundException.

Auch kann der Eclipse-IDE den Treiber sehen: enter image description here

+0

Haben Sie bereits die Paketstruktur des Glases überprüft? Ist jtds eine Option? – Marged

+0

@Marged Ja, und ich kann diesen bestimmten Treiber im Archiv sehen. –

+0

Haben Sie eine neuere Version ausprobiert? Soweit ich weiß, ist eine Version> 4.1 verfügbar. Verwenden von jTDS ist keine Option? – Marged

Antwort

1

die Kommentare zu diesem Beitrag hier überhaupt Sehen, gehe ich davon aus, dass man fast alle Optionen zur Verfügung gestellt ausprobiert habe. Wenn Sie sich die obigen Snapshots ansehen, nehme ich an, dass Sie ein Unix/Linux-basiertes System für Ihre Entwicklung verwenden. Es gibt eine Änderung in der Art und Weise, wie Sie Ihre CLASSPATH-Variable in Windows aktualisieren und unter Linux sagen.';' wird in Windows verwendet, während ':' in Linux. Hoffnung haben Sie kümmern sich um solche Kleinigkeiten gemacht:

Es gibt eine hilfreiche Link, kann ich Ihnen durchgehen suggerieren, wo es viele Mittel gegeben sind, das Problem zu lösen, die Sie konfrontiert sind: Link

2

Sie benötigen Fügen Sie die Bibliothek zu catalina.properties hinzu, da Sie die DB-Verbindung im Kontext der Kernfunktionalität des Containers und nicht nur als eine der untergeordneten Anwendungen verwenden.

Downvote meine Antwort, wie Sie es wünschen, aber ich bitte nur Sie testen es zuerst.

3

Der Code Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")

nicht ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver

als die Namen unterschiedlich sind werfen. Ist es möglich, dass Sie es in Ihrem Code falsch eingerichtet haben?

Ich habe die sqljdbc41.jar von ihrer Website heruntergeladen und sehen, dass der korrekte Name für die Klasse com.microsoft.sqlserver.jdbc.SQLServerDriver ist.

$ jar tf sqljdbc41.jar | grep SQLServerDriver.class 
com/microsoft/sqlserver/jdbc/SQLServerDriver.class 

Ich habe gerade beiden Namen auf Web-Dokumentation von Microsoft, also entweder die umbenannte dieser Klasse (änderte sein Paket) zu einem bestimmten Zeitpunkt, oder sie haben Fehler auf einem Teil ihrer Dokumente.

Alles, was Sie tun müssen, ist diese .jar in Tomcat's lib-Verzeichnis (z. B. apache-tomcat-7.0.67\lib) zu löschen und Tomcat neu zu starten.

Wenn Sie den korrekten Klassennamen und die richtige jar im Verzeichnis lib haben, und immer noch diesen Fehler sehen, frage ich mich, ob Sie eine Art Tippfehler in Ihrem Eclipse-Setup haben, und die Bereitstellung von Eclipse ist irgendwie erzwingen Versuchen Sie, diesen gebrochenen Klassennamen zu laden. (Ich verwende Eclipse nicht, und ich weiß nichts über die Bereitstellung von dort).

Versuchen Sie, eine sehr einfache Anwendung erstellen (und sagen nicht die MS-Treiberklasse Eclipse über):

@WebServlet("/") 
public class SimpleServlet extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     // Set response content type 
     resp.setContentType("text/html"); 
     PrintWriter out = resp.getWriter(); 
     out.println("<h1>" + "Welcome to the servlet!" + "</h1>"); 
     try { 
      String server = "localhost"; 
      String database = "testDB"; 
      String password = "sapassword"; 

      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
      String connectionUrl = "jdbc:sqlserver://"+server+":1433;databaseName="+database+";user=sa;password="+password+";"; 
      Connection con = (Connection) DriverManager.getConnection(connectionUrl); 
     } catch (ClassNotFoundException e) { 
      out.println("<h2>" + e.getClass().getSimpleName() + "_" + e.getMessage() + "</h2>"); 
     } catch (SQLException e){ 
      out.println("<h2>" + e.getClass().getSimpleName() + "_" + e.getMessage() + "</h2>"); 
     } finally { 
      out.println("<h1>" + "That's the end of the servlet!" + "</h1>"); 
     } 
    } 
} 

Und es läuft. Wenn Sie folgende Ausgabe sehen:

Welcome to the servlet! 

SQLServerException_The TCP/IP connection to the host localhost, port 1433 has failed. Error: "Connection refused: connect. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.". 

That's the end of the servlet! 

Es bedeutet, dass der Treiber ordnungsgemäß geladen wurde. Die Verbindung ist fehlgeschlagen b/c Ich habe derzeit keine SQLServer-Instanz zum Testen ausgeführt.

+0

Wir haben die Lösung gefunden, aber da es eine Prämie für diesen Beitrag gab, durfte ich sie nicht löschen und war mehrere Tage weg. Es gab eine harte Kodierung, die im Grunde ignorierte, was passiert war. Aber Sie haben Recht, und diese Subtilität wurde verpasst, bevor Sie das Kopfgeld anboten. –

1

Ich glaube, Sie müssen auf dem Dialekt Klasse registriert werden: org.hibernate.dialect.SQLServer2012Dialect

wenn es Frühling Projekt wurden, in eine Datei application.properties verbunden ist:

spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver 
    spring.jpa.database-platform=org.hibernate.dialect.SQLServer2012Dialect 
    spring.datasource.url=jdbc:sqlserver:database;user=sa;password=password; 
    spring.datasource.username=sa 
    spring.datasource.password=password 

aber hier wird es genau so sein, wie ich mich nicht erinnere