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

运行时编辑Liquibase ChangeLog新增changeset后migrate未识别变更

问题根因分析

1. 资源读取路径不匹配

你修改的是src/changesets/DbChangelog.json源码目录下的文件,但初始化Liquibase时使用的是ClassLoaderResourceAccessor,该访问器默认从项目编译后的类路径(如Maven的target/classes、Gradle的build/classes目录)读取资源,运行时修改源码目录的文件不会自动同步到编译后的类路径,因此Liquibase读取到的始终是编译时打包的旧版本空文件。

2. 类加载器资源缓存

即使你修改的是类路径下的文件,默认ClassLoader会对已读取的资源做缓存,同样会导致无法加载到最新的文件内容。

解决方案

替换ClassLoaderResourceAccessor为FileSystemResourceAccessor,直接读取文件系统中你修改后的changelog文件,绕开类路径的限制。修改后的execute方法示例如下:

public void execute(Connection connection) throws LiquibaseException, IOException {
    Database database = DatabaseFactory.
            getInstance().
            findCorrectDatabaseImplementation(new JdbcConnection(connection));

    // 此处路径和你写入的changelog文件路径保持一致即可
    String changelogFilePath = "src/changesets/DbChangelog.json";
    liquibase.Liquibase liquibase = new liquibase.Liquibase(changelogFilePath, new FileSystemResourceAccessor(), database);

    liquibase.update(new Contexts(), new LabelExpression());
}
额外优化建议
  • 可以将changelog的存储路径抽为全局常量,避免写入和读取时路径不一致的问题
  • 调用liquibase.update前可先读取目标路径的changelog文件打印内容,提前确认文件写入生效,排除IO操作异常导致的内容未更新问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 14:24:03