Подтвердить что ты не робот

ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver

У меня есть проект веб-разработки с использованием локальной установки Tomcat 7. Я пытаюсь подключиться к SQL Server 2012 с помощью драйвера Microsoft для jdbc (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. Согласно документации я считаю, что использую правильный драйвер. Это также указывает, что 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)

Итак, почему я все еще сталкиваюсь с этим?

Update

Я снова загрузил sqljdbc41.jar из Microsoft - просто чтобы убедиться, что как-то первая банка не была повреждена.

Следуя ссылке Mick Mnemonic, я удалил банку из пути Java Build и поместил недавно загруженную банку в папку WEB-INF/lib веб-приложения. Затем я перезапустил Eclipse и сервер Tomcat и очистил сервер Tomcat и проект.

По-прежнему получаем ClassNotFoundException.

Кроме того, среда ID Eclipse может видеть драйвер: введите описание изображения здесь

4b9b3361

Ответ 1

Код 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

Я только что нашел оба имени в веб-документации Microsoft, так что либо переименовал этот класс (изменил его пакет) в какой-то момент, либо имел ошибки в некоторых своих документах.

Все, что вам нужно сделать, это удалить этот .jar в каталоге Tomcat lib (например, apache-tomcat-7.0.67\lib) и перезапустить Tomcat.

Если у вас есть правильное имя класса и правый jar в каталоге lib и по-прежнему видят эту ошибку, я задаюсь вопросом, есть ли у вас какая-то опечатка в вашей настройке 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 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 the end of the servlet!

Это означает, что драйвер загружен правильно. Не удалось выполнить соединение b/c У меня нет экземпляра SQLServer, который в настоящее время выполняется для проверки.

Ответ 2

Вам нужно добавить библиотеку в catalina.properties, потому что вы используете соединение с БД в контексте функциональности ядра контейнера, а не только как одно из дочерних приложений внутри него.

Понизьте мой ответ, как хотите, но я прошу сначала проверить его.

Ответ 3

Взглянув на все комментарии здесь, на этом посту, я предполагаю, что вы попробовали почти все предоставленные опции. Глядя на ваши снимки, приведенные выше, я предполагаю, что вы используете систему на основе Unix/Linux для вашей разработки. Существует изменение в том, как вы обновляете переменную CLASSPATH в Windows и говорите в Linux. ';' используется в Windows, а ":" - в Linux. Надеюсь, вы позаботились о таких мелких деталях:

Там есть полезная ссылка, которую я могу предложить вам пройти, где есть много средств для решения проблемы, с которой вы сталкиваетесь: Ссылка

Ответ 4

Я думаю, вам нужно зарегистрироваться в диалоговом классе: org.hibernate.dialect.SQLServer2012Dialect

если это был проект spring, он подключен к файлу application.properties:

spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
    spring.jpa.database-platform=org.hibernate.dialect.SQLServer2012Dialect
    spring.datasource.url=jdbc:sqlserver:database;user=sa;password=password;
    spring.datasource.username=sa
    spring.datasource.password=password

но здесь это будет точно так же, как я не помню