liquibase 的 valueblobfile 路径是相对于变更日志(changelog)文件所在目录解析的,而非类路径根或项目根目录;若路径计算错误(如误用相对路径导致越级跳转),将抛出 “blob resource not found” 异常。
liquibase 的 valueblobfile 路径是相对于变更日志(changelog)文件所在目录解析的,而非类路径根或项目根目录;若路径计算错误(如误用相对路径导致越级跳转),将抛出 “blob resource not found” 异常。
在使用 Liquibase 的
例如,当 Spring Boot 配置为:
spring:
liquibase:
change-log: classpath:db/changelog/changelog-master.xml
Liquibase 会自动将 classpath:db/changelog/ 解析为 base path(注意:这是资源加载路径,不是文件系统路径)。随后,它会将 valueBlobFile 的值(如 "../../../db/changelog/dc_form_definition_202304051700.csv-1.data.txt")直接拼接到该 base path 后,形成最终查找路径:
db/changelog/../../../db/changelog/dc_form_definition_202304051700.csv-1.data.txt → 简化后等价于:db/changelog/dc_form_definition_202304051700.csv-1.data.txt
但实际文件位于 src/main/resources/db/changelog/dc_form_definition_202304051700.csv-1.data.txt,而上述拼接逻辑因 ../../../ 引入冗余层级,导致解析失败 —— 这正是异常 BLOB resource not found 的根本原因。
✅ 正确做法:始终使用相对于 changelog 文件所在目录的、简洁的相对路径。假设 changelog-master.xml 位于 src/main/resources/db/changelog/ 下,且目标数据文件 dc_form_definition_202304051700.csv-1.data.txt 也在同一目录,则应写为:
<changeset author="Krishna" id="insert-3"><insert tablename="blob_test"><column name="name" value="Name3"></column><column name="formData" type="longblob" valueblobfile="dc_form_definition_202304051700.csv-1.data.txt"></column></insert></changeset>
⚠️ 注意事项:
- 不要使用 ../ 或 ../../../ 等向上跳转路径,除非你明确知道 changelog 文件的实际嵌套层级;
- 所有 valueBlobFile 指定的文件必须位于 classpath 可达路径下(通常为 src/main/resources/ 及其子目录),且构建后存在于 JAR/WAR 的对应位置;
- 若文件位于不同子目录(如 db/changelog/data/),则路径应写为 data/dc_form_definition_202304051700.csv-1.data.txt;
- 对于 Spring Boot,可通过 spring.liquibase.change-log 显式确认 base path,避免隐式推断偏差;
- 建议在 IDE 中右键检查 changelog-master.xml 的实际资源路径,并确保 valueBlobFile 路径与之构成合法、扁平的相对关系。
总结:valueBlobFile 是“changelog 目录相对路径”,不是“类路径相对路径”或“绝对路径”。坚持“同级优先、路径最短”原则,可彻底规避资源未找到问题。










