我有一个使用Tomcat 7
本地安装的Web开发项目。我正在尝试使用Microsoft的jdbc(SQL Server 2012
)驱动程序连接到sqljdbc41.jar
。
sqljdbc41.jar
位于我的应用程序构建路径中:
我正在出口它。此外,在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.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
。
答案 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