Flyway迁移脚本相对路径读取文件报FileNotFoundException的解决方法
解决Flyway迁移脚本相对路径读取文件的问题
问题原因
Flyway的FILE_READ函数解析相对路径时,是基于JVM启动的工作目录(通常是项目根目录),而非迁移脚本文件所在的目录。你之前用./../../assets/images/testuser.png是基于脚本所在的db/special/h2目录往上回溯,但Flyway实际从项目根目录开始解析路径,因此导致文件找不到。
可行解决方案
1. 使用基于项目根目录的相对路径
直接用从项目根出发的路径访问图片,这是最简单的方案:
update PUBLIC.user set image=FILE_READ('./db/assets/images/testuser.png') where username='testuser';
只要项目目录结构不变,这个路径在任何系统下都能保持一致。
2. 配置Flyway自定义变量
如果不想硬编码项目根路径,可以在Flyway配置里添加自定义变量指向资源根目录:
flyway: locations: "db/migration,/db/special/{vendor}" placeholders: assetRoot: "./db/assets"
然后在迁移脚本里引用这个变量:
update PUBLIC.user set image=FILE_READ('${assetRoot}/images/testuser.png') where username='testuser';
这种方式更灵活,后续若资源目录结构调整,只需修改配置即可。
3. 将资源放入Flyway迁移目录(可选)
如果允许调整资源位置,可把图片放到对应数据库的迁移目录下(比如db/special/h2/assets/images),然后用相对路径:
update PUBLIC.user set image=FILE_READ('./assets/images/testuser.png') where username='testuser';
不过这个方案会让资源和脚本耦合,适合小型项目或专属资源场景。
验证方法
可先在项目根目录下执行ls ./db/assets/images/testuser.png(Linux/macOS)或dir .\db\assets\images\testuser.png(Windows),确认文件存在后再运行Flyway迁移,就能确保路径正确。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

