在Spring Boot中如何配置liquibase.command.dropAll.requireForce?
使用Spring Boot 3.3.4搭配Liquibase 4.27.0,测试环境执行drop-all操作时,日志出现警告:
13:33:25.739 I - l.ui INFO: The drop-all command may result in unrecoverable destructive changes to objects at 'jdbc:postgresql://localhost:5432/postgres'.
To protect against unwanted drops, set --requireForce=true, which will require a --force=true flag on the command.
Learn more at https://docs.liquibase.com/dropall.
尝试通过application.yml的spring.liquibase.parameters配置:
spring: liquibase: parameters: liquibase.command.dropAll.requireForce: true liquibase.command.dropAll.force: true
但配置无效,原因是Liquibase 4.27.0的dropAll方法硬编码参数列表,未读取自定义参数:
CommandScope dropAll = new CommandScope("dropAll") .addArgumentValue(DbUrlConnectionArgumentsCommandStep.DATABASE_ARG, Liquibase.this.getDatabase()) .addArgumentValue(DropAllCommandStep.CATALOG_AND_SCHEMAS_ARG, finalSchemas) .addArgumentValue("dropDbclhistory", dropDbclhistory);
方案1:自定义Liquibase Bean,手动注入参数
创建自定义Liquibase Bean,覆盖默认的dropAll逻辑,手动添加force和requireForce参数:
import liquibase.CommandScope; import liquibase.DropAllFailedException; import liquibase.Liquibase; import liquibase.database.Database; import liquibase.exception.LiquibaseException; import liquibase.integration.spring.SpringLiquibase; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; import java.util.Set; @Configuration public class CustomLiquibaseConfig { @Value("${spring.liquibase.change-log}") private String changeLog; @Bean public Liquibase liquibase(DataSource dataSource) throws LiquibaseException { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource); springLiquibase.setChangeLog(changeLog); springLiquibase.afterPropertiesSet(); // 包装原Liquibase实例,重写dropAll方法 return new Liquibase(springLiquibase.getLiquibase().getDatabaseChangeLog(), springLiquibase.getLiquibase().getResourceAccessor(), springLiquibase.getLiquibase().getDatabase()) { @Override public void dropAll(Set<String> schemas, boolean dropDbclhistory) throws DropAllFailedException { try { CommandScope dropAll = new CommandScope("dropAll") .addArgumentValue("database", getDatabase()) .addArgumentValue("catalogAndSchemas", schemas) .addArgumentValue("dropDbclhistory", dropDbclhistory) // 添加需要的参数 .addArgumentValue("requireForce", true) .addArgumentValue("force", true); dropAll.execute(); } catch (LiquibaseException e) { throw new DropAllFailedException(e); } } }; } }
如果测试代码通过SpringLiquibase的dropAll方法触发,这个自定义Bean会覆盖原有逻辑,自动带上指定参数。
方案2:通过系统属性传递参数
在测试环境启动时,添加JVM系统参数:
-Dliquibase.command.dropAll.requireForce=true -Dliquibase.command.dropAll.force=true
Liquibase命令参数会优先读取系统属性,执行drop-all时就能识别到这些参数,消除警告。
方案3:升级Liquibase版本
Liquibase后续版本(如4.30.0及以上)优化了dropAll方法的参数传递逻辑,支持通过Spring Boot配置项直接传递。如果项目允许,可升级版本后再尝试原有spring.liquibase.parameters配置。
内容的提问来源于stack exchange,提问作者adarshr

