一,记一次liquibase错误
Specifying files by absolute path was removed in Liquibase 4.0. Please use a relative path or add ‘/’ to the classpath parameter.
在使用liquibase的时候,changelog的sqlFile找不到对应的sql文件:

<!-- changelog.xml -->
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd">
<changeSet author="mrzhang" id="reference-20230101-1400">
<sqlFile path="../sql/mysql_init_data.sql" relativeToChangelogFile="true" />
</changeSet>
</databaseChangeLog>
项目结构层级:

按理说liquibase启动的时候是可以找到sql文件的,如果去看liquibase的原码,会发现在4.x版本中默认是相对路径,sqlFile 的path属性会默认在前面拼接一个classpath*:,此处项目启动仍然找不到对应文件。寻求官方,发现一个PR:https://github.com/liquibase/liquibase/pull/2758,发现可能是Maven打包的问题
可恶的Maven果然没有把我的sql文件打包

再查看pom.xml发现在resources标签中没有将.sql文件包含在内,加上之后就可以了,启动无误~

二,升级SpringBoot遇到的liquibase问题
今天把Boot版本从2.7.x更新到了3.0.x,然后解决一些jar包和依赖的问题之后,liquibase报错!项目无法启动了。
Error creating bean with name ‘liquibase’ defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]
仔细查看报错信息,发现是某个sql文件找不到对应的文件了,导致FileNotFoundException:

可是按理说,为啥我没升级前不报错呢,莫非升级了就找不到这个文件了?先看一下我liquibase的目录结构层次,以及changelog咋写的:

<!--changelog_v1.0.xml-->
<changeSet id="reference-20230101-1400" author="zhangyong">
<sqlFile path="../sql/mysql_init_data.sql" relativeToChangelogFile="true" />
</changeSet>
在报错的地方打断点看看:

发现问题了,这个路径不应该是classes/sql而应该是classes/db/sql。可以得出,旧版本的sqlFile标签中的path是根据自己本身的文件所在位置进行查找,而新版本如果写了…/则是会直接在resources目录下查找文件,从而导致了路径异常。
将上述中sqlFile的path属性改为../db/sql/mysql_init_data.sql或者sql/mysql_init_data.sql,问题解决。
本文记录了在使用Liquibase时遇到的两个问题:一是由于Liquibase 4.0版本不再支持绝对路径,导致sqlFile无法找到,通过检查Maven资源打包配置解决了;二是SpringBoot升级到3.0.x后,liquibase启动报错,发现新版本对sqlFile路径解析方式变化,通过修改路径表达式恢复正常。
8063

被折叠的 条评论
为什么被折叠?



