Liquibase 4.0及以上版本在Spring Boot集成测试中无法找到changelog文件
问题根因
你当前的报错是两个配置不匹配导致的:
- 你使用了
FileSystemResourceAccessor,该访问器仅支持读取本地文件系统路径,无法识别classpath:前缀,也无法读取Jar包内的类路径资源 src/test/resources/是源代码目录结构,测试运行时该目录不存在,编译后的资源文件会直接放到类路径根目录下,原路径失效
可行解决方案
推荐使用类路径访问方式,该方案在本地运行、Jar包运行场景下均有效,修改LiquibaseRunner类中的实例化代码即可:
- 将资源访问器从
FileSystemResourceAccessor替换为ClassLoaderResourceAccessor,该访问器专门用于加载类路径下的资源 - 去掉路径中的
src/test/resources/前缀,直接写类路径下的相对路径db/changelog/db.changelog-test.xml
修改后的代码片段如下:
public static void runUpdate(Connection connection) throws LiquibaseException { Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection)); // 仅修改下面这行代码即可 Liquibase liquibase = new liquibase.Liquibase("db/changelog/db.changelog-test.xml", new ClassLoaderResourceAccessor(), database); liquibase.update(new Contexts(), new LabelExpression()); }
如果你必须使用FileSystemResourceAccessor,可以先通过Spring工具类获取资源的本地绝对路径,该方案仅支持本地运行、不支持Jar包部署场景,代码如下:
// 需引入spring-core的ResourceUtils工具类 String changelogPath = ResourceUtils.getFile("classpath:db/changelog/db.changelog-test.xml").getAbsolutePath(); Liquibase liquibase = new liquibase.Liquibase(changelogPath, new FileSystemResourceAccessor(), database);
内容的提问来源于stack exchange,提问作者Aram
相关产品推荐
相关产品推荐

