如何在Dropwizard环境下阻止Liquibase记录无变更的迁移结果?
解决Liquibase无变更时输出更新摘要的问题
为什么之前的配置没用?
那个更新摘要是Liquibase直接往**标准输出(System.out)**里打印的,根本不走SLF4J日志框架,所以你调日志器、环境变量、JVM属性这些常规日志配置完全管不到它。
靠谱的解决方案
1. 直接在Dropwizard YAML里加配置(最简单)
找到配置文件里的Liquibase块,添加show-summary: false参数即可:
database: liquibase: change-log: classpath:/db/changelog.xml show-summary: false # 关闭无变更时的摘要输出
这个参数是Dropwizard集成Liquibase时提供的,大部分新版本都支持。
2. 自定义Liquibase执行逻辑(适配旧版本)
如果你的Dropwizard版本太老不支持上面的参数,就自己写Liquibase的更新代码,手动关闭摘要:
import io.dropwizard.db.ManagedDataSource; import liquibase.Liquibase; import liquibase.database.Database; import liquibase.database.DatabaseFactory; import liquibase.database.jvm.JdbcConnection; import liquibase.resource.ClassLoaderResourceAccessor; import liquibase.Contexts; import liquibase.LabelExpression; // 在你的Application子类的run方法里替换默认的Liquibase执行逻辑 @Override public void run(YourAppConfig config, Environment env) throws Exception { ManagedDataSource dataSource = config.getDatabase().getDataSourceFactory().build(env.metrics(), "liquibase"); try (Connection conn = dataSource.getConnection()) { Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(conn)); Liquibase liquibase = new Liquibase( config.getDatabase().getLiquibase().getChangeLog(), new ClassLoaderResourceAccessor(), database ); // 最后一个参数传false,禁用更新摘要输出 liquibase.update("", new Contexts(), new LabelExpression(), false); } }
3. 临时重定向System.out(兜底方案)
要是上面两种方案都不适用,就用个笨办法:启动时把System.out临时定向到空输出流,跑完Liquibase再恢复。注意这个会屏蔽所有System.out的输出,别影响其他功能:
import java.io.ByteArrayOutputStream; import java.io.PrintStream; public static void main(String[] args) throws Exception { PrintStream originalOut = System.out; try { // 临时将System.out重定向到空输出流 System.setOut(new PrintStream(new ByteArrayOutputStream())); // 启动Dropwizard应用 new YourApp().run(args); } finally { // 恢复原System.out System.setOut(originalOut); } }
内容的提问来源于stack exchange,提问作者Gadi
相关产品推荐
相关产品推荐

