0

I tried to set a connection between a Servlet and MS SQL SERVER 2012 following the instructions reported on this page

This is my code:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    } catch (ClassNotFoundException e) {
        out.println("Can't load database driver");
        e.printStackTrace();
        return;
    }

However, when I run the servlet I get the following error message:

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at demo.Connect.doGet(Connect.java:42)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

My first suspect was that I messed up with the classpath of the JDBC driver, but I triple-checked and it looks ok, in fact I can see the sqljdbc.jar inside the Libraries (see image):

project tree

I also tried the version sqljdbc4.jar,but the results is the same.

Is anybody able to figure out where the problem is and how to solve it?

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
Alex Reds
  • 197
  • 2
  • 4
  • 17

1 Answers1

4

You're correct: CLASSPATH is key.

For a "normal" Java/JDBC app, using the location for sqljdbc4.jar from the Microsoft installer, your Windows CLASSPATH should usually be:

CLASSPATH =.;C:\Program Files\Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\enu\sqljdbc.jar

For a servlet deployed as a .war file, your sqljdbc4.jar should be in WEB-INF/lib.

Q: Have you checked your actual .war file (and/or deployed war) to make sure sqljdbc4.jar is actually in WEB-INF/lib?

paulsm4
  • 114,292
  • 17
  • 138
  • 190
  • So I should simply move sqljdbc4.jar in WEB-INF/lib and it will work? – Alex Reds Nov 06 '15 at 09:17
  • Yes: http://stackoverflow.com/questions/5467038/adding-3rd-party-jars-to-web-inf-lib-automatically-using-eclipse-tomcat – paulsm4 Nov 06 '15 at 09:27
  • ok thank you but there is something I still don't understand: should I drop sqljdbc4.jar in WEB-INF/lib AND also set the buildpath or it is enough to put the sqljdbc4.jar in WEB-INF/lib? If the latter, should I clear the buildpath previously set (removing sqljdbc4.jar from JRE System Library )? – Alex Reds Nov 06 '15 at 14:04
  • Apples and Oranges. 1) Your build path is to *build your project*; to compile your Java source. 2) You *ALSO* need to insure your .war has all the runtime dependencies it needs. Tomcat knows nothing about your Windows JDBC driver install. But it *will* look in the .war's WEB-INF/iib. Q: Make sense? – paulsm4 Nov 06 '15 at 19:29