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

Java КлассNotFoundException для org.h2.Driver

Я пытаюсь использовать H2 для подключения к базе данных в Java (используя Eclipse в качестве IDE). В примере (ниже) ClassNotFoundException. Дело в том, что я добавил файл h2 jar в систему 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);

 }

}
4b9b3361

Ответ 1

В моем случае (не связанный немного, но стоит упомянуть), я добавил это к моему 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>

Ответ 2

Недавно я столкнулся с исключением 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>

Ответ 3

В примере (ниже) выбрано ClassNotFoundException

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

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

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

Я пропущу шаг?

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

java -cp h2.jar com.acme.Program

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

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

Ответ 4

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

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

в

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

Ответ 5

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

Ответ 6

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

java ClassNotFoundException для org.h2.Driver

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

было:

    <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 как зависимость от другого проекта. В основном встречается как тест только на джунит. Так что в приложении это не будет работать.

Ответ 7

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

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>

Ответ 8

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

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

String url = "jdbc:h2:mem:~/test";

Ответ 9

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

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