이것저것 해보기🌼

java.lang.ClassNotFoundException: org.h2.Driver - H2 연결 에러 해결 본문

BE/Spring

java.lang.ClassNotFoundException: org.h2.Driver - H2 연결 에러 해결

realtree 2024. 5. 7. 09:42

 

 

에러 로그 

java.lang.ClassNotFoundException: org.h2.Driver
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:467)
	at org.springframework.util.ClassUtils.forName(ClassUtils.java:304)

 

 

상황

테스트, 로컬 환경에서는 h2 db 사용 (In-memory 방식)

운영 환경에서는 mySQL 사용

 

환경

  • Framework : Spring Boot 3.2.5
  • Build : Gradle 8.7
  • JDK : JDK17

 

세팅

application.yml

spring:
  config:
    activate:
      on-profile: local
  session:
    store-type: jdbc
  h2:
    console:
      enabled: true
      path: /h2-console
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:test
    username: sa
    password:
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true

 

build.gradle

dependencies {
	implementation 'com.mysql:mysql-connector-j'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	runtimeOnly 'com.h2database:h2:2.2.224'
	
}

 

 

IntelliJ active profile 설정 (Community 버전)

Edit Configutation > Add VM Options : 아래와 같이 입력

-Dspring.profiles.active=local

 

 

 

오류 원인

1번. application.properties, application.yml 파일에서 "org.h2.Driver" 뒤에 공백문자가 입력되어있는지 확인

driver-class-name: org.h2.Driver

이 줄에서 맨 뒤에 공백이 있으면 안된다.

 

2번. 빌드 시 h2 버전을 자동으로 못잡을 수 있으므로 버전 명시.

또한 scope를 맞게 지정했는지 확인. local 빌드 시에도 h2를 쓸거라면 testImplementaion이 아닌 runtimeOnly로 변경.

runtimeOnly 'com.h2database:h2:2.2.224'

 

external libraries에 h2가 잘 추가되었는지 확인

 

3번. test, main 폴더의 application.yml 파일이 모두 제대로 있는지 확인

test 실행시 test의 resource 폴더 내에 application.yml 파일을 참조하고, 없으면 main에 있는 applicaion.yml 파일을 참조한다.

main 실행 시 main의 resource 폴더 내에 있는 application.yml 파일을 참조한다.

원하는 실행 위치에서 각 설정파일이 모두 제대로 세팅되어있는지 확인

 

 

 

 

자주 나오는 오류 원인들을 모두 고친 이후에도 동일한 오류가 계속 발생한다.

 

h2 의 jar 파일을 직접 넣어주는것은 내 경우에 In-memory 방식이어서 맞지 않는다.

datasource url을 아래와 같이 mem:[testDB Name] 으로 입력해주면 인메모리 방식을 사용한다는 것이다.

jdbc:h2:mem:test

 

그리고 build.gradle에 runtimeOnly로 h2를 가져온것 역시 인메모리 방식을 사용하기 위해서였다.

 

 

 

해결방법

해결방법은 h2의 버전 문제였다.

h2의 버전이 뭔가 IntelliJ 설정이나 다른 jdbc, 스프링부트 버전 등과 맞지 않아서 충돌할 수 있다는 포스팅이 몇개 있어서

2.1 버전으로 다운그레이드 해도 실패하고,

아예 최신 버전으로 업그레이드 해도 실패하더니

결국 2.1.214 버전에서 성공했다...

 

Spring Boot 3 버전 이상 : 2.1.214 버전 이상 사용 (2024.5월 기준 최신 버전 2.2.224 은 사용불가)

Spring Boot 2 버전 : 1.4.200 버전 사용 (2.0 이상 버전으로는 사용불가)

 

h2 모든 버전 확인하기 : https://mvnrepository.com/artifact/com.h2database/h2

 

Ultimate 버전이 아니다 보니 아래와 같은 방법으로 확인을 해볼수가 없어서 더 찾기가 힘들었다ㅠㅠ

https://youtrack.jetbrains.com/issue/DBE-18724

 

IntelliJ IDEA new H2 database version 2.2.200 driver : DBE-18724

IntelliJ IDEA do not have an option to select H2 database driver, highest version is 2.1.210. Outdated IntelliJ version maybe? Currently I'm using version 2023.1.2 (Ultimate Edition)

youtrack.jetbrains.com

 

암튼.... 역시 스프링부트는 버전과의 싸움인것을 다시 한번 확인했다....... 이제 다시 프로젝트 시작 가능................

 

참고

https://beaniejoy.tistory.com/63

 

[Spring Boot] H2 Database 설정(메모리방식)

Spring Boot로 개발할 때 간편하게 이용할 수 있는 h2 database에 대한 설정 내용을 기록하고자 합니다. 그 과정에서 에러 발생 및 처리에 대해서도 기록하고자 합니다. 해당 설정 내용은 github repository

beaniejoy.tistory.com