1

I am using H2 database with Spring Boot project. I have runtime dependency on h2 in build.gradle.kts file, but it is not able to find the driver.

Caused by: java.lang.IllegalStateException: Driver for test database type [H2] is not available
    at org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseConfigurerFactory.getConfigurer(EmbeddedDatabaseConfigurerFactory.java:57) ~[spring-jdbc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory.setDatabaseType(EmbeddedDatabaseFactory.java:132) ~[spring-jdbc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder.setType(EmbeddedDatabaseBuilder.java:121) ~[spring-jdbc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at com.example.datarestdemo.DataRestDemoApplication.dataSource(DataRestDemoApplication.kt:24) ~[main/:na]
    at com.example.datarestdemo.DataRestDemoApplication$$EnhancerBySpringCGLIB$$3e09cdea.CGLIB$dataSource$0(<generated>) ~[main/:na]
    at com.example.datarestdemo.DataRestDemoApplication$$EnhancerBySpringCGLIB$$3e09cdea$$FastClassBySpringCGLIB$$1a09d5e.invoke(<generated>) ~[main/:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at com.example.datarestdemo.DataRestDemoApplication$$EnhancerBySpringCGLIB$$3e09cdea.dataSource(<generated>) ~[main/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_211]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_211]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_211]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_211]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    ... 217 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.h2.Driver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_211]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_211]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_211]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_211]
    at java.lang.Class.forName0(Native Method) ~[na:1.8.0_211]
    at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_211]
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:282) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.jdbc.datasource.embedded.H2EmbeddedDatabaseConfigurer.getInstance(H2EmbeddedDatabaseConfigurer.java:51) ~[spring-jdbc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseConfigurerFactory.getConfigurer(EmbeddedDatabaseConfigurerFactory.java:49) ~[spring-jdbc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    ... 230 common frames omitted

This is how I added the runtime dependency

runtimeOnly("com.h2database:h2")

and this is plugin configuration

plugins {
    id("org.springframework.boot") version "2.2.5.RELEASE"
    id("io.spring.dependency-management") version "1.0.9.RELEASE"
    kotlin("jvm") version "1.3.61"
    kotlin("plugin.spring") version "1.3.61"
}

Am I missing something ?

Abdul Fatah
  • 463
  • 6
  • 23
  • Running from command line with `gradle bootRun` command works fine – Abdul Fatah Mar 01 '20 at 12:14
  • running main method within IntelliJ is causing problem – Abdul Fatah Mar 01 '20 at 12:14
  • Were you able to find the root cause ? I spent hours on this and your comment of using gradle bootRun worked. thanks – sss May 12 '21 at 10:08
  • I think gradle bootRun trigger bootJar task which generates a fat jar containing all the dependencies that are needed at runtime as well. That is something which intellij might not be doing and may be it only looked at compile classpath. – Abdul Fatah May 13 '21 at 14:57

0 Answers0