I have a web development project using local install of Tomcat 7
. I am trying to connect to SQL Server 2012
using Microsoft's driver for jdbc (sqljdbc41.jar
).
The sqljdbc41.jar
is in my application build path:
and I am exporting it. Furthermore, in the Tomcat application directory lib
folder I have also placed a copy of sqljdbc41.jar
.
There are no compile errors, but at runtime when I try to load the SQL Server driver I get the following:
ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver
The exception is thrown in the following code block:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://"+server+":1433;databaseName="+database+";user=sa;password="+password+";";
con = (Connection) DriverManager.getConnection(connectionUrl);
I have seen many posts on this topic without resolution:
and many more.
Compiler level 1.7 and a JRE of 1.7 - According to documentation, I believe I am using the correct driver. This also states that the CLASSPATH must be set:
echo $CLASSPATH
/var/common/sqljdbc41.jar
Which it is. Furthermore:
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)
So, why am I still encountering this???
Update
I downloaded the sqljdbc41.jar
from Microsoft again - just to be sure that somehow the first jar was not corrupt.
Following Mick Mnemonic's link, I removed the jar from the Java Build path and put the newly downloaded jar into the WEB-INF/lib
folder of the web application. I then restarted Eclipse and the Tomcat server and cleaned the Tomcat server, and the project.
Still getting the ClassNotFoundException
.
The code
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
cannot throw
ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver
as the names are different. Is it possible that you have it set up incorrectly in your code?
I downloaded the sqljdbc41.jar from their website and see that the correct name for the class is com.microsoft.sqlserver.jdbc.SQLServerDriver
.
$ jar tf sqljdbc41.jar | grep SQLServerDriver.class
com/microsoft/sqlserver/jdbc/SQLServerDriver.class
I just found both names on Microsoft's web documentation, so either they renamed this class (changed its package) at some point, or they have errors on some of their docs.
All you should need to do is drop that .jar in Tomcat's lib directory (e.g.apache-tomcat-7.0.67\lib
), and restart Tomcat.
If you have the correct class name, and the right jar in the lib directory, and are still seeing that error, I wonder if you have some sort of typo in your eclipse setup, and deploying from eclipse is somehow forcing an attempt to load that broken class name. (I don't use Eclipse, and I don't know about deploying from there).
Try creating a very simple application (and don't tell eclipse about the MS driver class):
@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>");
}
}
}
And running it. If you see output like:
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!
It means that the driver loaded properly. The connection failed b/c I don't have SQLServer instance currently running to test against.