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);
}
}
Ответы
Ответ 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