Spring Boot集成Liquibase启动报错:无法找到changelog文件
解决Spring Boot启动时Liquibase找不到changelog文件的问题
我之前在集成Liquibase的时候也碰到过完全一样的问题——CLI命令跑起来一切正常,但Spring Boot一启动就报找不到db/changelog/db.changelog-master.yaml的错误,折腾了好一阵子才解决。下面是我总结的排查步骤,你可以一步步试:
1. 先确认文件路径和拼写绝对正确
- 你的项目是Maven/Gradle结构的话,changelog文件必须放在
src/main/resources目录下,完整路径应该是src/main/resources/db/changelog/db.changelog-master.yaml,别误放到src/main/java里(这个目录下的非.java文件默认不会被打包到classpath)。 - 注意文件名大小写!尤其是在Linux或Mac环境下,系统是区分大小写的,要是你写成了
DB.changelog-master.yaml或者漏了某个字母,Spring Boot肯定找不到。
2. 检查Spring Boot的Liquibase配置
打开你的application.properties或application.yml,确认Liquibase的配置路径是否正确:
- 如果你用的是yml格式,配置应该是这样的:
要是你自定义了changelog的位置,这里的路径必须和实际文件路径对应。如果没配置这个属性,Spring Boot会默认找上述路径,所以还是得确保文件存在。spring: liquibase: change-log: classpath:db/changelog/db.changelog-master.yaml
3. 验证构建工具是否正确打包了资源文件
有时候问题出在构建工具没有把yaml文件复制到输出目录:
- Maven用户:检查
pom.xml里的资源插件配置,确保包含了yaml/yml文件:
执行<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.yaml</include> <include>**/*.yml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build>mvn clean package后,去target/classes目录下看看有没有db/changelog/db.changelog-master.yaml,如果没有,说明构建时没复制文件,得调整配置。 - Gradle用户:检查
build.gradle的sourceSets配置,确保resources目录被正确识别:
执行sourceSets { main { resources { srcDirs = ['src/main/resources'] include '**/*.yaml', '**/*.yml' } } }gradle clean build后,查看build/resources/main目录下的文件是否存在。
4. 清理IDE缓存并重新构建
IDE缓存有时候会坑人,导致文件没被同步到输出目录:
- IntelliJ IDEA:点击
Build -> Clean Project,然后Build -> Rebuild Project;也可以试试File -> Invalidate Caches...,勾选"Clear file system cache and local history"后重启IDE。 - Eclipse:点击
Project -> Clean,选择你的项目后执行清理,然后重新构建。
5. 多模块项目的特殊排查
如果是多模块Spring Boot项目:
- 确保changelog文件在启动模块的
src/main/resources下,或者在被依赖的模块中,且该模块的资源文件被正确打包(比如依赖模块的pom.xml里要配置资源导出)。 - 检查启动模块的依赖是否正确引入了包含changelog的模块。
按照这些步骤排查下来,基本都能解决问题。我当时就是因为Maven的资源插件默认过滤了yaml文件,加上IDE缓存没同步,才折腾了好久😅
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

