如何解决Liquibase includeAll搭配格式化sql时找不到databaseChangeLog声明报错
问题根因
- XML Schema校验失败:你使用的Liquibase 3.4.1版本引用了3.8版本的XSD文件,且命名空间的http/https前缀不匹配,导致无法识别
databaseChangeLog根标签 - 首次直接使用includeAll报错的原因:大概率是首次配置的path路径错误,Liquibase把主变更日志文件当成了目录扫描,因此抛出「不是可识别的文件类型」报错
注:Liquibase 3.4.1版本原生支持includeAll标签,无需额外引入扩展依赖
具体修复步骤
1. 修正includeAll-changelog.xml的头部配置
直接替换为匹配3.4.1版本的配置即可:
<?xml version="1.0" encoding="utf-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd"> <includeAll path="includeAllScriptsTest/" relativeToChangelogFile="true"/> </databaseChangeLog>
注意三个修改点:
- 命名空间统一使用http前缀,和schemaLocation的地址保持一致
- XSD版本替换为和当前Liquibase版本匹配的3.4版本,不要使用更高版本的XSD
includeAll的path不要加***/这类通配符前缀,开启relativeToChangelogFile="true"后,path直接填写相对于当前includeAll-changelog.xml文件的目录路径即可
2. 确认目录结构和引用配置匹配
如果你的文件目录结构如下:
conf/db/ ├── db-changelog-master.xml ├── includeAll-changelog.xml └── includeAllScriptsTest/ └── test.sql
需要保证主变更日志db-changelog-master.xml里的引用配置正确:
<include file="includeAll-changelog.xml" relativeToChangelogFile="true"/>
3. 校验formatted sql规范
你当前的test.sql基本符合要求,只需注意两个细节:
--liquibase formatted sql必须放在文件第一行,前面不能有空格、空行TABLE是SQL保留字,建议添加反引号转义:SELECT * FROMTABLE;
内容的提问来源于stack exchange,提问作者AmateurPCB
相关产品推荐
相关产品推荐

