Spring Boot中Flyway通配符配置无法匹配迁移脚本路径问题咨询
首先,你遇到的问题核心是Flyway版本升级带来的路径解析逻辑变化——你参考的Flyway 6.4的通配符规则,在7.1.1版本中已经调整了,这就是为什么你的通配符配置不生效的原因。
为什么通配符配置失效?
Flyway 7.0+对classpath路径的通配符处理做了重大调整,目的是更好地对齐Spring的ResourceLoader行为。在6.x版本中,Flyway自身解析classpath:db/*/migrations/这种通配符路径;但7.x版本开始,这类路径的解析完全交给Spring的资源加载器,而Spring默认对classpath:前缀的路径仅支持有限的通配符,尤其是在匹配多级目录时需要特殊处理。
你的生效配置都是具体路径(比如classpath:db/release_1.0/migrations/),而通配符路径(*/**)因为Spring资源加载器的限制,无法被正确解析到对应的migrations目录,所以才会抛出"找不到迁移脚本位置"的错误。
可行的解决方案
1. 使用classpath*:前缀启用多目录扫描
将配置中的classpath:替换为classpath*:,这是Spring特有的前缀,用于扫描所有classpath下符合模式的目录。修改后的配置如下:
spring: flyway: locations: "classpath*:db/*/migrations/"
或者匹配带版本前缀的目录:
spring: flyway: locations: "classpath*:db/release*/migrations/"
2. 显式列出所有迁移目录(最可靠)
如果通配符依然有问题,最稳妥的方式是直接列出所有包含migrations的具体路径,用列表形式配置:
spring: flyway: locations: - "classpath:db/release_1.0/migrations/" - "classpath:db/release_2.0/migrations/" # 根据实际目录继续添加
这种方式完全避免了通配符解析的问题,适合目录结构固定的场景。
3. 验证目录结构的正确性
确认你的db/xxx/migrations/目录确实位于Spring Boot的classpath下(默认是src/main/resources/目录内)。如果目录放在其他位置,需要确保它被正确加入到项目的classpath中。
额外说明
Flyway 7.x的官方文档明确提到,classpath路径的解析现在依赖于底层的资源加载器(Spring的ResourceLoader),所以之前6.x版本的通配符行为不再适用。
内容的提问来源于stack exchange,提问作者andras

