H2-升级后

Posted

技术标签:

【中文标题】H2-升级后【英文标题】:After H2-Upgrade 【发布时间】:2017-06-13 14:14:37 【问题描述】:

我在我的项目中升级了 h2-database,但现在它失败了,出现以下异常:

Caused by: org.springframework.beans.PropertyBatchUpdateException: Failed properties: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [org.h2.Driver]
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:121) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE]
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1518) ~[spring-beans-4.2.8.RELEASE.jar:4.2.8.RELEASE]
    ... 66 common frames omitted

这是我的 spring-context.xml:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="$db.driver" />
        <property name="url" value="$db.url" />
        <property name="username" value="$db.username" />
        <property name="password" value="$db.password" />
    </bean>

这里是我的 jdbc.properties,spring-context 加载数据以初始化我的数据源:

db.driver=org.h2.Driver
db.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
db.username=sa
db.password=

db.memurl=jdbc:h2:mem:test

在 h2 版本 1.4.179 上一切正常,但在 1.4.196 上失败。使用的 Spring 版本是 4.2.8。

我不明白为什么它会失败...H2 发生了一些变化,但我不知道是什么...有人知道吗?

--更新--

这里是 pom.xml 的所有依赖项(spring-version 是 4.2.8),这是我所有测试依赖项的通用项目(包装是 pom),它被多个项目使用。我使用 h2-database 作为内存数据库仅用于测试:

<dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.11</version>
            <exclusions>
                <exclusion>
                    <artifactId>junit</artifactId>
                    <groupId>junit</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.196</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>$spring.version</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.10.19</version>
        </dependency>
    </dependencies>
    <packaging>pom</packaging>

【问题讨论】:

您能否发布您的pom.xml 或 gradle build 以显示您如何添加依赖项? 我将 pom.xml 添加到初始帖子中。 【参考方案1】:

尝试添加

<scope>runtime</scope>

<scope>test</scope>

如果您打算仅使用 h2 进行测试

h2 依赖

【讨论】:

它找不到依赖关系,因为编译时存在依赖关系(我猜你没有编译错误)。运行时意味着在运行时保持对应用程序 jar 的依赖。 是的,我没有任何编译错误,但我也使用 JPA,所以我不关心使用的数据库。但是为什么随着版本升级行为发生了变化?!因为如果我降级了,一切都会重新工作......它是可复制的。

以上是关于H2-升级后的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 模式下升级 h2 数据库 jar 后选择语句失败

如何检查是不是需要升级 h2 数据库?

h2 升级到 1.2.147 的问题 - getNString 异常

Nginx 是不是支持以明文形式从 http/1.1 升级 http/2 (h2c)

无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”

Play Ebean 从 2.4 升级到 2.5 后不生成 Id