You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 5.7.42升级至8.0.3时Liquibase迁移报错求助

解决MySQL 8.0升级+Dropwizard Liquibase迁移异常问题

第一个异常:ClassCastException: LocalDateTime cannot be cast to String

根因

MySQL 8.0对TIMESTAMP类型的JDBC映射默认返回LocalDateTime,而你原使用的Dropwizard 1.3.24自带的旧版Liquibase(约3.5.x)未适配Java 8时间类型,在读取DATABASECHANGELOG表的DATEEXECUTED字段时,错误地尝试将LocalDateTime强转为String。

第二个异常:NoSuchMethodError: FileSystemResourceAccessor: method <init>()V not found

根因

Dropwizard 2.1.12的dropwizard-migrations模块依赖的Liquibase版本是3.10.3,而你手动升级到Liquibase 4.4.3后,Liquibase 4.x重构了FileSystemResourceAccessor类,移除了无参构造函数,导致Dropwizard的migrations代码调用不存在的方法,引发依赖冲突。


可行解决方案

方案1:使用Dropwizard 2.1.12兼容的Liquibase版本(推荐,适配Java 8)

  1. 移除显式的liquibase-core依赖,让Dropwizard自动管理兼容的Liquibase版本(3.10.3),避免版本冲突。
  2. 升级MySQL JDBC驱动到Java 8兼容的最高版本mysql:mysql-connector-java:8.0.33(8.0.34及以上版本要求Java 11+)。
  3. 配置Liquibase适配MySQL 8时间类型:
    • 在Dropwizard的配置文件(如config.yml)中添加:
      liquibase:
        parameters:
          liquibase.database.mysql.useDatetimeString: true
      
    • 或添加JVM启动参数:-Dliquibase.database.mysql.useDatetimeString=true
      该参数会让Liquibase将时间字段以字符串形式读取,避免类型转换错误。

方案2:验证依赖一致性

执行依赖树检查命令,确认无冲突:

  • Maven:mvn dependency:tree | grep liquibase
  • Gradle:./gradlew dependencies | grep liquibase
    确保只有Dropwizard自带的Liquibase版本(3.10.3)被引入。

额外检查

  1. 确认DATABASECHANGELOG表的DATEEXECUTED字段类型为TIMESTAMP,若之前有手动修改,恢复为Liquibase默认结构。
  2. 运行java -jar your-app.jar db validate config.yml验证变更集兼容性。

内容的提问来源于stack exchange,提问作者SomeCuriousQuestions

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:18:23