일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- MariaDB
- git
- 객체지향
- github
- GOF
- DP
- 다형성
- 상속
- Secret
- mock
- package
- Java
- azure
- netlify
- 디자인 패턴
- 캡슐화
- dfs
- 서브셋폰트
- 추상화
- Solid
- PostgreSQL
- dotenv
- npm
- 클라우드
- 메모이제이션
- CSS
- bfs
- AOP
- process.env
- 동적계획법
- Today
- Total
이것저것 해보기🌼
java.lang.ClassNotFoundException: org.h2.Driver - H2 연결 에러 해결 본문
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'
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
암튼.... 역시 스프링부트는 버전과의 싸움인것을 다시 한번 확인했다....... 이제 다시 프로젝트 시작 가능................
참고
https://beaniejoy.tistory.com/63
'BE > Spring Boot' 카테고리의 다른 글
Spring Security Deprecated 코드 변환하기 (0) | 2024.05.07 |
---|---|
springSecurityFilterChain cannot be null 에러 해결방법 (0) | 2024.05.07 |
[웹] 세션 (0) | 2021.08.29 |
[프로그래머스 과제관] 주문 관리 API 서버 개발 (6) | 2021.07.08 |
[JUnit] CRUD 테스트코드 작성하기 (0) | 2021.07.06 |