ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver

时间:2015-12-10 20:05:25

标签: sql-server jdbc driver classnotfoundexception

我有一个使用Tomcat 7本地安装的Web开发项目。我正在尝试使用Microsoft的jdbc(SQL Server 2012)驱动程序连接到sqljdbc41.jar

sqljdbc41.jar位于我的应用程序构建路径中:

enter image description here

我正在出口它。此外,在Tomcat应用程序目录lib文件夹中,我还放置了sqljdbc41.jar的副本。

没有编译错误,但在运行时,当我尝试加载SQL Server驱动程序时,我得到以下内容:

ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver

以下代码块中抛出异常:

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

我在没有解决方案的情况下看过很多关于这个主题的帖子:

  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");"
  4. 还有更多。

    编译器级别1.7和JRE 1.7 - 根据documentation,我相信我使用的是正确的驱动程序。这也表明必须设置CLASSPATH:

    echo $CLASSPATH
    /var/common/sqljdbc41.jar
    

    它是什么。此外:

    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)
    

    那么,为什么我还在遇到这个?

      

    更新

    我再次从Microsoft下载了sqljdbc41.jar - 只是为了确保第一个jar没有损坏。

    按照Mick Mnemonic的链接,我从Java Build路径中删除了jar,并将新下载的jar放入Web应用程序的WEB-INF/lib文件夹中。然后我重新启动Eclipse和Tomcat服务器并清理Tomcat服务器和项目。

    仍然获得ClassNotFoundException

    此外,Eclipse IDE可以看到驱动程序: enter image description here

3 个答案:

答案 0 :(得分:4)

代码 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")

不能扔 ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver

因为名字不同。是否可能在代码中设置错误?

我从他们的网站下载了sqljdbc41.jar,看到该类的正确名称为com.microsoft.sqlserver.jdbc.SQLServerDriver

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

我刚刚在微软的网络文档中找到了这两个名字,所以要么在某个时候重命名了这个类(更改了它的包),要么他们的某些文档都有错误。

您需要做的就是将.jar放在Tomcat的lib目录中(例如apache-tomcat-7.0.67\lib),然后重启Tomcat。

如果你有正确的类名,并且lib目录中有正确的jar,并且仍然看到那个错误,我想知道你的eclipse设置中是否有某种拼写错误,并且从eclipse部署会以某种方式强制尝试加载那个破碎的类名。 (我不使用Eclipse,我不知道从那里部署)。

尝试创建一个非常简单的应用程序(并且不要告诉eclipse关于MS驱动程序类):

@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>");
        }
    }
}

运行它。如果您看到如下输出:

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!

这意味着驱动程序正确加载。连接失败b / c我没有正在运行的SQLServer实例进行测试。

答案 1 :(得分:2)

您需要将库添加到catalina.properties,因为您在容器的核心功能的上下文中使用数据库连接,而不仅仅是其中的子应用程序之一。

按照您的意愿向我推荐我的答案,但我只是要求您先测试它。

答案 2 :(得分:1)

看看这篇文章中的所有评论,我假设您已经尝试了几乎所有提供的选项。查看上面提供的快照,我假设您正在使用基于Unix / Linux的系统进行开发。在Windows中更新CLASSPATH变量的方式发生了变化,比如在Linux中更新。 ';'在Windows中使用,而在Linux中使用':'。希望你能够处理这些细节:

我建议您通过一个有用的链接,解决您遇到的问题有很多补救措施:Link