java ClassNotFoundException для org.h2.Driver

Я пытаюсь использовать H2 для подключения к базе данных на Java (используя Eclipse в качестве среды IDE). ). Образец (ниже) выдает ClassNotFoundException. Дело в том, что я добавил файл jar h2 в системный CLASSPATH. Я даже несколько раз проверял его наличие через printenv в консоли. Я пропускаю шаг?

КОД:

import java.sql.*;

public class Program {

 /**
  * @param args
  */
 public static void main(String[] args) 
  throws Exception{

  try{
   System.out.println("hello, world!");
   Class.forName("org.h2.Driver");
   Connection conn = DriverManager.getConnection("jdbc:h2:~/testdb", "sa", "");
   // add application code here
   conn.close();
  }catch(ClassNotFoundException ex){
   System.out.println( "ERROR: Class not found: " + ex.getMessage() );

  }
  System.exit(0);

 }

}

person Ashton Wilkins    schedule 24.10.2010    source источник
comment
Как вы добавили Jar в свой путь к классам? Чтобы быть уверенным, я бы создал папку в вашем проекте под названием «lib», скопировал в нее банку, затем щелкните правой кнопкой мыши и выберите «Путь сборки» «Добавить в путь сборки».   -  person William    schedule 24.10.2010
comment
Не могли бы вы правильно отформатировать свой код - выберите код и используйте 5-ю кнопку (Пример кода) на панели инструментов редактирования в режиме редактирования.   -  person Neeme Praks    schedule 24.10.2010
comment
Как вы запускаете свой код? Внутри Eclipse или из командной строки? Как вы добавили h2.jar в путь к классам? Как вы проверили наличие h2.jar в пути к классам?   -  person Neeme Praks    schedule 24.10.2010
comment
Я добавил его в CLASSPATH с помощью консоли: sudo gedit /etc/environment, а затем вручную добавил строку вида ключ=значение. Затем я вышел из системы и вошел в систему, проверил, и это там.   -  person Ashton Wilkins    schedule 24.10.2010
comment
Neeme — я запускаю код из Eclipse, используя меню RUN.   -  person Ashton Wilkins    schedule 24.10.2010
comment
Уильям - спасибо, я новичок в разработке Java (признаюсь, что я парень C #, но Java растет на мне). Ваша рекомендация сработала: т. е. я добавил банку в путь сборки в Eclipse, сделал перестроение, и исключение ClassNotFoundException больше не выбрасывалось. Еще раз спасибо!   -  person Ashton Wilkins    schedule 24.10.2010


Ответы (13)


В моем случае (немного не связанном, но заслуживающем упоминания) я добавил это в свой maven pom, и сообщение об ошибке исчезло:

  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>xxx</version> <!-- ex: 1.2.140 -->
  </dependency>

или если вы используете h2 только во время модульного тестирования:

  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>xxx</version> <!-- ex: 1.2.140 -->
    <scope>test</scope>
  </dependency>
person rogerdpack    schedule 31.07.2013
comment
Возможно, стоит добавить <scope>test</scope>, так как это, вероятно, чаще всего используется. Последняя версия доступна здесь: h2database.com/html/main.html. - person GlenPeterson; 14.11.2016

Недавно я столкнулся с исключением java.lang.ClassNotFoundException: org.h2.Driver в IntelliJ IDEA 2017.2 EAP при использовании последней версии (1.4. 196) драйвера H2. Решение состояло в том, чтобы перейти на версию 1.4.195, которая сработала.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.195</version>
    <scope>test</scope>
</dependency>
person naXa    schedule 14.06.2017
comment
Мне пришлось перейти с 1.4.197, чтобы решить эту проблему, до сих пор не знаю, почему. - person Ivana; 19.06.2018

У меня была следующая ошибка (используя Intellij)

java ClassNotFoundException для org.h2.Driver

Решил это, удалив прицел из моего pom.

был:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
        <scope>test</scope>
    </dependency>

изменился на:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
    </dependency>

Этот тип ошибки возникает, когда мы реализуем проект Maven Quickstart как зависимость от другого проекта. В основном встречается как тест только для junit. Так что в приложении это не сработает.

person Ali_Nass    schedule 14.12.2018

Образец (ниже) создает исключение ClassNotFoundException.

Тогда драйвер не находится в пути к классам.

Дело в том, что я добавил файл jar h2 в системный CLASSPATH. Я даже проверял это несколько раз через «printenv» в консоли.

Как именно вы это сделали? Покажите, пожалуйста, полученный результат.

Я пропускаю шаг?

Я не могу сказать с предоставленной информацией. Но полагаться на переменную среды CLASSPATH в любом случае — плохая практика, и вам следует использовать параметр -cp, если вы запускаете Java в командной строке. Нравится:

java -cp h2.jar com.acme.Program

Есть ли способ настроить Eclipse на использование файла jar при использовании меню RUN, чтобы мне не приходилось постоянно запускать консоль?

да. В Eclipse добавьте JAR в путь сборки проекта: щелкните правой кнопкой мыши проект, затем Свойства > Путь сборки Java > Библиотеки > Добавить JARS... (при условии, что H2 JAR доступен в каталоге относительно вашего проекта). Другие IDE имеют аналогичный способ сделать это.

person Pascal Thivent    schedule 24.10.2010
comment
Спасибо. Я не знал, что CLASSPATH был плохой политикой. Есть ли способ настроить Eclipse на использование файла jar при использовании меню RUN, чтобы мне не приходилось постоянно запускать консоль? - person Ashton Wilkins; 24.10.2010

В моем случае (я использую sbt) изменить

libraryDependencies += "com.h2database" % "h2" % "1.4.196" % Test

to

libraryDependencies += "com.h2database" % "h2" % "1.4.196"
person Xianhong Xu    schedule 08.02.2018

Если вы используете зависимость изменения Gradle в build.gradle:

testCompile group: 'com.h2database', name: 'h2', version: '1.4.199'

to

compile group: 'com.h2database', name: 'h2', version: '1.4.199'
person Sanchez    schedule 29.05.2019
comment
Это помогло мне. :) - person GreenROBO; 20.09.2019

<scope>[database_name]</scope> должна включать базу данных, с которой вы работаете. Если вы измените свою базу данных с одной на другую, обязательно измените область действия. Как только поменял, ошибка исчезла.

person Dhiraj Gandhi    schedule 19.09.2017

Используйте релизную версию.

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
person Vahe Gharibyan    schedule 14.10.2018

В моем случае это проблема строки подключения. Я видел это.

После того, как я добавил mem в строку URL ниже, все заработало.

String url = "jdbc:h2:mem:~/test";
person uudaddy    schedule 09.02.2019

Использование <scope>test</scope> не должно работать логически. попробуйте с <scope>runtime</scope> или <scope>provided</scope>, если только вам это не нужно только на этапе тестирования.

В документах maven говорится, что <scope>test</scope> зависимость не требуется для нормального использования приложения и доступна только на этапах тестовой компиляции и выполнения
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html< /а>

person Aman    schedule 22.07.2018
comment
Я не знаю, кто проголосовал за это, но удаление ‹scope›test‹scope› действительно работает для меня. - person Noman_ibrahim; 25.08.2019

Я столкнулся с той же проблемой при использовании : 2 раза в базе данных h2, потому что диспетчер драйверов не может определить правильный тип подключения.

  • когда вы используете «jdbc:h2:localhost:123/db», он делится на «jdbc», «h2: localhost», «123/db»,
  • поэтому здесь ожидаемое значение равно h2, но получается h2:localhost из-за проблемы в основном регулярном выражении для определения класса драйвера из списка загруженных драйверов.

Используйте полный путь, например:

  • Не делайте: "jdbc:h2:testdb", делайте: "jdbc:h2:/c:/.../testdb"
  • Не делайте: "jdbc:h2:localhost:123/db", Делайте: "jdbc:h2://localhost:123/db"
person Dharmendrasinh Chudasama    schedule 27.02.2020

Я работаю с IntelliJ. У меня был "h2-1.4.200" в папке lib. Я пробовал каждое предложение, начиная от , до . Как ни странно, моя проблема была решена только путем перехода в следующие места: Структура проекта -> Артефакт -> Макет вывода -> Доступные элементы, а затем расширение содержимого папки, а затем щелкните правой кнопкой мыши «h2-1.4.200» и, наконец, выберите « Извлечь в выходной корень". :) Странное решение

person Mina Shirali    schedule 18.04.2020

Я использую сбт. В build.sbt я удалил зависимость "h2" и включил вместо нее: "com.h2.database" % "h2" % "1.4.200" И это сработало!

person Divyanshi Mangal    schedule 22.04.2020
comment
это кажется мне копией stackoverflow.com/a/48676896/1392312 - person Rossiar; 22.04.2020
comment
Нет, этот человек только что удалил test из зависимости. Я только что добавил зависимость h2 и добавил к ней пару изменений. Пожалуйста, внимательно прочитайте оба ответа. - person Divyanshi Mangal; 29.04.2020