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)
- 移除显式的
liquibase-core依赖,让Dropwizard自动管理兼容的Liquibase版本(3.10.3),避免版本冲突。 - 升级MySQL JDBC驱动到Java 8兼容的最高版本
mysql:mysql-connector-java:8.0.33(8.0.34及以上版本要求Java 11+)。 - 配置Liquibase适配MySQL 8时间类型:
- 在Dropwizard的配置文件(如
config.yml)中添加:liquibase: parameters: liquibase.database.mysql.useDatetimeString: true - 或添加JVM启动参数:
-Dliquibase.database.mysql.useDatetimeString=true
该参数会让Liquibase将时间字段以字符串形式读取,避免类型转换错误。
- 在Dropwizard的配置文件(如
方案2:验证依赖一致性
执行依赖树检查命令,确认无冲突:
- Maven:
mvn dependency:tree | grep liquibase - Gradle:
./gradlew dependencies | grep liquibase
确保只有Dropwizard自带的Liquibase版本(3.10.3)被引入。
额外检查
- 确认
DATABASECHANGELOG表的DATEEXECUTED字段类型为TIMESTAMP,若之前有手动修改,恢复为Liquibase默认结构。 - 运行
java -jar your-app.jar db validate config.yml验证变更集兼容性。
内容的提问来源于stack exchange,提问作者SomeCuriousQuestions
相关产品推荐
相关产品推荐

