Два класса видят драйвер JDBC по-разному - PullRequest
0 голосов
/ 14 октября 2018

У меня есть два класса в одном каталоге - тестовый и основной.Оба должны подключиться к базе данных через драйвер JDBC, который подключается через pom.xml.

Классы имеют одинаковые параметры подключения, но тестовый класс работает нормально, и основной класс выдает ClassNotFoundException: com.mysql.jdbc.Driver.Я пробовал разные версии коннектора, теперь он самый свежий (8.0.12).

Я также пытался вручную добавить jar-файл с драйвером - ситуация повторилась.Больше идей нет.

тестовый класс:

package app.model;

import app.entities.StandartGame;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class DBTest {

private static final String USERNAME = "root";
private static final String PASSWORD = "root";
private static final String DATABASEURL = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Moscow&useSSL=false";

public static void main(String[] args) {

    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection = DriverManager.getConnection(DATABASEURL, USERNAME, PASSWORD);
        Statement statement = connection.createStatement();

        String thisName, thisGenre;
        double thisPrice;

        ResultSet resultSet = statement.executeQuery("select * from GameShop");
        List<StandartGame> games = new ArrayList<StandartGame>();

        while (resultSet.next()) {
            thisPrice = resultSet.getDouble("price");
            thisName = resultSet.getString("name");
            thisGenre = resultSet.getString("genre");

            StandartGame game = new StandartGame(thisName, thisPrice, thisGenre);
            games.add(game);
        }

        for (StandartGame game: games) {
            System.out.println(game.getName());
        }


    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
  }
}

основной класс:

package app.model;

import app.entities.StandartGame;
import java.sql.*;
import java.util.List;

public class SingletonModel {

private static SingletonModel model;

private static final String USERNAME = "root";
private static final String PASSWORD = "root";
private static final String DATABASEURL = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Moscow&useSSL=false";

public static String driverPath = "com.mysql.cj.jdbc.Driver";
public static Connection connection;
public static Statement statement;

public static synchronized void addGames(StandartGame ... gamez) {
    try {

        Class.forName(driverPath);
        connection = DriverManager.getConnection(DATABASEURL, USERNAME, PASSWORD);
        statement = connection.createStatement();

        String thisName, thisGenre;
        double thisPrice;

        for (StandartGame stg : gamez) {
            thisName = stg.getName();
            thisGenre = stg.getGenre();
            thisPrice = stg.getPrice();
            statement.executeUpdate("insert into GameShop (name, genre, price) VALUE " +
                    "('"+thisName+"', '"+thisGenre+"', '"+thisPrice+"')");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1138)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:291)
at app.model.SingletonModel.addGames(SingletonModel.java:50)
at app.servlets.AddServlet.doPost(AddServlet.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:844)

1 Ответ

0 голосов
/ 14 октября 2018

Это почти наверняка связано с тем, как вы настроили код, а не сам код.Исключение исходит от Class.forName, и использование diff показывает, что указанные вами строки одинаковы (никаких хитрых гомоглифов или других опечаток).

Типичный подход - попробовать простейшую вещь, котораяпо-прежнему не удается. Минимальный, завершенный и проверяемый пример является локальным термином переполнения стека для этого.

Замена всего кода в этом примере должна показать проблему без всякой другой чепухи.Вы можете использовать точно такой же код со встроенной литеральной строкой с копией и вставкой между ними или ссылаться на класс напрямую.

Class<?> driverClass = com.mysql.cj.jdbc.Driver.class;

(Возможно, вам придется исправить путь к классу для вашегоСначала компилятор исходного кода Java.) Обычно это можно заменить непосредственным построением драйвера.

java.sql.Driver driver = new com.mysql.cj.jdbc.Driver();

Мы перевели ошибку времени выполнения в ошибку времени компиляции.Выиграть!Что ж, в этом случае это, вероятно, закончится ошибкой времени соединения.

В зависимости от того, что после этого переключения, исключение показывает, что во время выполнения возникает проблема с classpath.Это может быть что-то в pom.xml - драйвер MySQL должен быть виден в пути к классам для , запускающего веб-приложение.

Вы можете развернуть библиотечные классы вместе с кодом вашего веб-приложения.В качестве альтернативы существуют другие стандартные места для размещения библиотек в веб-контейнерах (см. Вашу документацию), которые могут использоваться более широко и позволяют избежать накладных расходов при перезагрузке драйверов при повторном развертывании в работающем контейнере во время разработки.Драйверы JDBC - это просто библиотеки классов в jar-файлах (у некоторых есть нативные компоненты, но я полагаю, что в наши дни это в значительной степени ограничено хитрыми мостами с нативными интерфейсами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...