Liquibase SQL变更集加载CSV文件抛出FileNotFoundException问题求解
问题根因
你使用的MySQL原生LOAD DATA LOCAL INFILE命令仅能读取运行MySQL客户端(此处为Wildfly进程)所在服务器的文件系统实体文件,无法直接读取打包在WAR包内部的类路径资源。即使CSV文件被打包进WAR,只要没有解压到文件系统生成实体文件,该命令就无法识别WAR内部路径,所以你尝试的各类路径写法都会触发FileNotFoundException。
推荐解决方案(符合SQL风格变更集规范)
不用XML格式,直接使用Liquibase SQL变更集内置的loadData能力,该能力支持直接读取类路径下的CSV资源,无需依赖MySQL原生加载命令,写法如下:
-- changeset user:insert-prices-data-temp-table -- loadData file="prices.csv" tableName="prices_temp" separator="," quoted="true" ignoreHeaderLine="true" encoding="UTF-8"
因为你的CSV文件和SQL变更集存放在同一目录下,直接填写CSV文件名即可,Liquibase会自动从当前变更集所在的类路径定位资源,不需要额外处理部署后的路径问题。
备选方案(必须使用MySQL原生LOAD DATA的场景)
如果业务要求必须使用原生LOAD DATA命令,可按以下步骤操作:
- 修改Wildfly部署配置,开启WAR包部署时自动解压到本地文件系统的开关
- 在变更集中通过系统变量获取Wildfly的解压部署目录,拼接出CSV文件的实体文件绝对路径
- 动态拼接LOAD DATA命令执行
该方案需要适配不同环境的部署路径规则,维护成本较高,非必要不建议使用。
额外检查项
你当前主变更日志的<includeAll>配置中filter="xml"为正则匹配规则,仅会加载文件名匹配xml规则的变更集,如果你的SQL变更集后缀为.sql,需要将filter修改为filter=".*\\.sql",否则SQL变更集会被过滤无法执行。
内容的提问来源于stack exchange,提问作者tomaytotomato
相关产品推荐
相关产品推荐

