测试数据库类型 [H2] 的驱动程序在类路径中不可用

Posted

技术标签:

【中文标题】测试数据库类型 [H2] 的驱动程序在类路径中不可用【英文标题】:Driver for test database type [H2] is not available in the classpath 【发布时间】:2016-09-11 05:42:12 【问题描述】:

我正在尝试运行Spring security web application,但是在部署网络应用程序时,我遇到了以下异常:

o.s.b.f.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/baeldung/spring/TestDbConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'entityManagerFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/baeldung/spring/TestDbConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Driver for test database type [H2] is not available in the classpath
    at o.s.b.f.s.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at o.s.b.f.s.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
    at o.s.b.f.s.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
    at o.s.b.f.s.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    at o.s.b.f.s.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    ... 23 frames truncated
Caused by: o.s.b.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'entityManagerFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/baeldung/spring/TestDbConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Driver for test database type [H2] is not available in the classpath
    at o.s.b.f.s.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at o.s.b.f.s.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
    ... 27 common frames omitted
Caused by: o.s.b.f.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/baeldung/spring/TestDbConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Driver for test database type [H2] is not available in the classpath
    at o.s.b.f.s.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at o.s.b.f.s.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
    at o.s.b.f.s.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
    at o.s.b.f.s.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    at o.s.b.f.s.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    ... 17 frames truncated
    ... 28 common frames omitted

虽然我已经在 pom.xml 下面添加了

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.192</version>
        </dependency>

所以这个 jar 也可以在类路径中使用,但仍然高于异常。

谁能告诉我我做错了什么?

【问题讨论】:

jar 将位于 IDE 的类路径中。它是否也部署在您的运行时环境中? @JimGarrison 通常所有在类路径中添加的jar在创建war文件时都复制到应用程序的lib文件夹中。所以这个jar也应该被复制。 应用如何打包部署? @JimGarrison 通过创建应用程序的war文件 您是否确认 WAR 文件实际上包含库,并且它位于正确的路径,并且库 jar 文件包含该类? 【参考方案1】:

这是在我的情况下有效的解决方案,我在 pom.xml 文件中进行了以下更改,我必须添加 &lt;scope&gt;h2 依赖项

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.192</version>
    <scope>runtime</scope>
</dependency>

这个范围用于限制依赖的传递性,也 影响用于各种构建任务的类路径。

运行时范围

这个范围表示不需要依赖 编译,但用于执行。它在运行时和测试中 类路径,但不是编译类路径。

【讨论】:

为什么还要改版本? @ChristianMICHON 已更改版本

以上是关于测试数据库类型 [H2] 的驱动程序在类路径中不可用的主要内容,如果未能解决你的问题,请参考以下文章

在类路径上未检测到 Spring WebApplicationInitializer 类型

使用H2数据库在游戏中运行测试时,未知数据类型为“JSONB”

加载位于 H2 数据库的类路径中的 CSV 文件

从静态上下文中获取测试类名称

H2 数据库错误 未知数据类型 INTERVAL

在测试我的 Quarkus 应用程序时如何使用内存中的 H2 数据库?