Как установить драйвер JDBC в веб-проект Eclipse, не сталкиваясь с java.lang.ClassNotFoundexception

Есть ОЧЕНЬ похожий вопрос к моему, но в моем случае у меня нет дубликатов jar в моем пути сборки, поэтому решение не работает для меня. Я искал в Google пару часов, но ни одно из найденных там решений не решило мою проблему. Я создаю веб-сайт с возможностью подключения к базе данных для домашней работы. Я использую базу данных MySQL, разрабатываю в Eclipse и работаю в Windows.

Я продолжаю получать java.lang.ClassNotFoundException: com.mysql.jdbc.Driver со следующим кодом:

import java.sql.*;
//...
public void someMethodInMyServlet(PrintWriter out)
{
    Connection connection = null;
    PreparedStatement query = null;
    try {

        out.println("Create the driver instance.<br>");
        Class.forName("com.mysql.jdbc.Driver").newInstance();

        out.println("Get the connection.<br>");
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
        query = connection.prepareStatement( "SELECT * FROM customers");

        //...
    } catch (Exception e)
    {
        out.println(e.toString()+"<br>");
    }
}
//...

Когда я запускаю приведенный выше код, я получаю следующий вывод:

Create the driver instance.
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Это не проходит мимо Class.forName... линия, и я не могу понять, почему! Вот что я сделал:

  1. Скачать MySQL-коннектор.
  2. Поместите это в мою папку MySQL C:\Program Files\MySQL\mysql-connector-java-5.1.12\mysql-connector-java-5.1.12-bin.jar,
  3. Открыл свойства проекта в Eclipse.
  4. Добавить External Jar в мой путь сборки, и я выбрал mysql-connector-java-5.1.12-bin.jar,

Каждый раз, когда я пытаюсь использовать сервлет, я получаю одну и ту же ошибку, независимо от того, есть ли у меня банка или нет. Не могли бы вы помочь мне понять это?

13 ответов

Решение

Что касается каждой "сторонней" библиотеки в виде файла JAR, который должен использоваться веб-приложением, просто скопируйте / удалите физический файл JAR в веб-приложении. /WEB-INF/lib, Затем он будет доступен в пути к классам веб-приложения по умолчанию. Кроме того, Eclipse достаточно умен, чтобы заметить это. Не нужно хлопотать с buildpath. Однако обязательно удалите все ненужные ссылки, которые вы добавили ранее, иначе это может привести к конфликту.

Альтернатива - установить его на самом сервере, сбросив физический файл JAR на собственный сервер. /lib папка. Это требуется, когда вы используете предоставленный сервером источник данных пула соединений JDBC, который, в свою очередь, нуждается в драйвере JDBC MySQL.

Смотрите также:

Так как вы запускаете его в servletВы должны иметь доступ к банке из контейнера сервлета. Вы также включаете разъем как часть вашего приложения war или поместите его как часть расширенной библиотеки контейнера сервлетов и управления источниками данных, если таковые имеются. Вторая часть полностью зависит от контейнера, который у вас есть.

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

А не пустой main(), попробуйте что-то вроде этого, адаптированное из прилагаемой документации:

public class LoadDriver {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
    }
}

На моей платформе я бы сделал это:

$ ls mysql-connector-java-5.1.12-bin.jar 
MySQL-разъем-Java-5.1.12-bin.jar
$ javac LoadDriver.java 
$ java -cp mysql-connector-java-5.1.12-bin.jar:. LoadDriver

На вашей платформе вам нужно использовать ; в качестве разделителя пути, как обсуждалось здесь и здесь.

Поместите mysql-connector-java-5.1.6-bin.jar в папку \Apache Tomcat 6.0.18\lib. Ваша проблема будет решена.

Что вы не должны делать (особенно при работе над общим проектом)

Хорошо, после того, как была та же проблема и после прочтения некоторых ответов здесь и в других местах. кажется, что положить external lib в WEB-INF/lib не очень хорошая идея, как это pollute webapp/JRE libs with server-specific libraries - для получения дополнительной информации проверьте этот ответ "

Другое решение, которое я НЕ рекомендую: скопировать его в папку tomcat / lib. хотя это может работать, будет сложно управлять зависимостями для общего проекта (например, git).

Хорошее решение 1

Создайте vendor папка. положи туда всю свою внешнюю библиотеку. затем сопоставьте эту папку как зависимость от вашего проекта. в затмении вам нужно

  1. добавьте свою папку в build path
    1. Project Properties -> Java build path
    2. Libraries -> добавить внешнюю библиотеку или любое другое решение, чтобы добавить ваши файлы / папки
  2. добавьте свой путь сборки к deployment Assembly ( ссылка)
    1. Project Properties -> Deployment Assembly
    2. Add -> Java Build Path Entries
    3. Теперь вы должны увидеть список библиотек в вашем пути сборки, который вы можете указать для включения в готовую WAR.
    4. Выберите те, которые вы хотите, и нажмите Finish.

Хорошее решение 2

использование maven (или любая альтернатива) для управления зависимостями проекта

Просто следуйте этим шагам:

1) Установить затмение
2) Импорт Apache для затмения
3) Установите MySQL
4) Скачать mysqlconnector / J
5) Разархивируйте заархивированный файл, перемещайтесь по нему до тех пор, пока в нем не появится файл bin. Затем поместите все файлы, которые находятся в папке, содержащей bin, в C:\Program Files\mysql\mysql server5.1/, затем укажите тот же путь, что и адрес, при определении драйвера в eclipse.

Это все очень просто, ребята.

Предполагая, что ваш проект основан на maven, добавьте его в свой POM:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.26</version>
    </dependency>

Сохранить> Построить> и снова протестировать соединение. Оно работает! Фактическая версия Java-коннектора mysql может отличаться.

Единственное решение, которое мне помогло, - это поместить файл.jar в WEB-INF/lib . Надеюсь, это поможет.

Моя проблема была немного другой. Вместо jdbc:oracle:thin:@server:port/service у меня было это как server:port/service,

Пропал был jdbc:oracle:thin:@ в url атрибут в GlobalNamingResources.Resource. Но я упустил из виду исключение кота

java.sql.SQLException: Cannot create JDBC driver of class 'oracle.jdbc.driver.OracleDriver' for connect URL 'server:port/service'

Если проблема все еще сохраняется,

Поместите jar- mysql-connector-java-5.0.8-bin в папку Tomcat->lib-> (независимо от того, где вы установили Tomcat). И измените свою переменную среды (Готово, нажав Свойства Mycomputer - Расширенные настройки системы - Переменные среды - И установите новое имя переменной и значения переменной в качестве места, где находится ваш файл lib. Не забудьте ввести; в конце пути)

Если проблема не исчезла, попробуйте загрузить файл commons-collection-2.0.jar ( http://www.docjar.com/jar_detail/commons-collections-2.0.jar.html) и вставьте банку в то же место, где находится ваша банка mysql (т.е. внутри Tomcat-lib.

Очисти свой проект - останови свой сервер - наконец попробуй запустить.

Right click on the Project, go to Properties. 
Choose Deployment Assembly (if not found, read the update part) from the left pane. 
Check if Java Build Path Entries are provided. 
If not, click on Add and include it. If it is already present, click Add to include your connector jar as Archive. 
Do a Project>Clean, restart your Server.

Много раз я сталкивался с этой проблемой, я испытывал ClassNotFoundException. если баночка не в физическом месте.

Поэтому убедитесь, что файл.jar (соединитель mysql) находится в физическом расположении папки lib WEB-INF. и убедитесь, что перезапустите Tomcat с помощью команды shutdown в cmd. он должен работать.

Поместите mysql-connector-java-5.1.38-bin.jar в C:\Program Files\Apache Software Foundation\Tomcat 7.0\lib folder.by, выполняя эту программу с помощью execute

Для этой ошибки:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

вам нужно:

Import java.sql.*;
Import com.mysql.jdbc.Driver;

даже если он не используется до запуска приложения.

Другие вопросы по тегам