【问题标题】:can't load jdbc database driver for MS Microsoft SQL无法为 MS Microsoft SQL 加载 jdbc 数据库驱动程序
【发布时间】:2016-02-07 00:51:06
【问题描述】:

我尝试按照this page 上报告的说明设置 Servlet 和 MS SQL SERVER 2012 之间的连接

这是我的代码:

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;
    }

但是,当我运行 servlet 时,我收到以下错误消息:

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)

我的第一个怀疑是我弄乱了 JDBC 驱动程序的类路径,但我检查了三次,它看起来没问题,实际上我可以在库中看到 sqljdbc.jar(见图):

我也试过sqljdbc4.jar的版本,结果还是一样。

有谁知道问题出在哪里以及如何解决?

【问题讨论】:

    标签: sql-server servlets jdbc


    【解决方案1】:

    你是对的:CLASSPATH 是关键。

    对于“普通”Java/JDBC 应用程序,使用 Microsoft 安装程序中 sqljdbc4.jar 的位置,您的 Windows CLASSPATH 通常应该是:

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

    对于部署为 .war 文件的 servlet,您的 sqljdbc4.jar 应位于 WEB-INF/lib

    问:您是否检查了实际的 .war 文件(和/或部署的 war)以确保 sqljdbc4.jar 实际上位于 WEB-INF/lib 中?

    【讨论】:

    • 所以我应该简单地将 sqljdbc4.jar 移动到 WEB-INF/lib 中,它会起作用吗?
    • 好的,谢谢,但我仍然不明白:我应该将 sqljdbc4.jar 放在 WEB-INF/lib 中并设置构建路径还是将 sqljdbc4.jar 放入WEB-INF/库?如果是后者,我应该清除之前设置的构建路径(从 JRE 系统库中删除 sqljdbc4.jar )吗?
    • 苹果和橙子。 1) 您的构建路径是构建您的项目;编译您的 Java 源代码。 2) 您需要确保您的 .war 具有它需要的所有运行时依赖项。 Tomcat 对您的 Windows JDBC 驱动程序安装一无所知。但它查看 .war 的 WEB-INF/iib。问:有意义吗?
    猜你喜欢
    • 2013-03-03
    • 2015-10-10
    • 2017-05-17
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多