【问题标题】:DB migrations (Liquibase + Maven + Spring)数据库迁移(Liquibase + Maven + Spring)
【发布时间】:2026-01-03 05:35:01
【问题描述】:

我来自 .Net 背景,我在一个使用 MavenSpringLiquibase 的 Java 项目上崭露头角。不用说,这是一个需要处理的新概念和框架。

测试无法完成:

我的测试无法成功完成,因为它们在尝试访问我的数据库中的表时失败。他们失败了,因为该表不存在。我看到我的项目中有许多 Liquibase XML 格式的迁移文件,但我正在研究如何运行它们。

liquibase-maven-plugin 不是一个选项:

我看到其他人可能会使用liquibase-maven-plugin 插件,但就我而言,该项目没有在任何 pom.xml 中引用该插件,只有liquibase-core。鉴于他们从未在 pom.xml 文件中引用过这个插件,有少数其他开发人员知道他们过去在这个项目上所做的工作,我认为这是有充分理由的,我不会搅拌那个锅.

SpringLiquibase?

他们引用了一个看起来像这样的 bean:<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">,经过进一步研究,它似乎可以进行自动数据迁移,

太棒了!

....但是我该如何调用它呢?我的项目必须已经通过了我的测试并且在这个逻辑被击中之前实际上已经被“运行”了吗?如果是这种情况并且我的项目必须成功构建/测试,那么我显然必须在这个 SpringLiquibase bean 之外运行我的迁移。

我应该使用liquibase 命令行吗?如果是这样,我可以放心地假设这是以前的开发人员在最初建立数据库时所做的吗?

【问题讨论】:

  • 使用真实数据库进行测试?也许你可以多分享一点,因为很难说问题是什么。还有为什么liquibase-maven-plugin 不是一个选项,而 liquibase cli 是?
  • @RC,我的service 模块测试确实命中了开发数据库,​​是的。而且,虽然是的,但我也可以只安装 liquibase-maven-plugin可能 解决此问题,但它从未使用过是有原因的。因为我是新手,所以我不想在不了解在我之前如何完成的“为什么”的情况下开始修改事物。我以前一直是项目的负责人,看到新人只是更改设置以使某些东西“工作”,尽管它在那个人出现之前完全正常运行并且由于缺乏理解而改变了事情,这让我感到非常沮丧。跨度>

标签: java eclipse spring maven liquibase


【解决方案1】:

你说得对,SpringLiquibase 设置应该自动进行数据库更新,但它只会在 spring 框架启动时才会这样做。

我的猜测是,您的正常应用程序启动会通过 Spring 触发 Liquibase,但测试框架不会。也许他们没有注意到这一点,因为他们倾向于在 liquibase 更改日志文件中更改数据库,然后启动普通应用程序进行初始测试(更新数据库),然后构建并运行测试。现在您首先运行测试,数据库还没有。

您能否判断您的测试是否正在尝试启动 Spring?

即使在应用程序使用 SpringLiquibase 的情况下,我通常也建议您将项目配置为允许使用 liquibase-maven-plugin、ant 插件或命令行进行手动更新,因为它往往会产生更高效的过程。通过该设置,您可以添加变更集,然后运行 ​​liquibase 更新,而无需经历整个应用程序启动甚至运行您的测试。您可以将其设置为在测试执行时自动运行,但更新过程通常很少,因此最好避免每次测试执行时的 liquibase 更新开销。将其包含在应用程序的 Spring 设置中仍然非常有帮助,这样在 QA 和生产环境中您就不必记住手动更新数据库,它会自动保持最新状态。

【讨论】: