运行时编辑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
相关产品推荐
相关产品推荐

