Spring Boot:在不启动应用程序的情况下运行液化基迁移

2022-09-02 10:54:25

在Spring Boot中,文档似乎鼓励在应用程序启动时运行迁移。

这很好,但有时应用程序启动可能会有我不想打扰的副作用/依赖关系 - 我只想自己运行迁移。只需设置一个本地开发数据库,即可在其中四处走动,甚至无需运行应用。

相比之下,在Dropwizard中,单独运行迁移对于应用程序的内置参数非常简单,就像这样

java -jar hello-world.jar db migrate helloworld.yml

有没有与Spring Boot相当的东西?还是我只需要下拉并直接运行液化物?

我对直接的答案感兴趣,但也有兴趣看看我是否在更高层次上误解了某些东西 - 就像也许这种在创业上运行的方法通常是“更好的”,因为一些我还没有发现的原因,所以鼓励你这样做 Spring Boot 作为一个设计选择。


答案 1

我知道这是一个老问题,但万一其他人偶然发现它,这可能很有用。

你可以为应用定义一个命令行参数,该参数将用于仅启动将运行迁移的应用上下文的一部分。

下面是 Kotlin 中的一个示例:

import org.springframework.boot.ApplicationContextFactory.ofContextClass
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
import org.springframework.boot.builder.SpringApplicationBuilder
import org.springframework.boot.runApplication
import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.context.annotation.Import

@SpringBootApplication
class Application

@Import(DataSourceAutoConfiguration::class, LiquibaseAutoConfiguration::class)
class LiquibaseInit

fun main(args: Array<String>) {
    if (args.contains("dbinit")) {
        SpringApplicationBuilder(LiquibaseInit::class.java)
            .contextFactory(ofContextClass(AnnotationConfigApplicationContext::class.java))
            .run(*args)
        return
    }

    runApplication<Application>(*args)
}

注意:在 Spring Boot 2.4.0 及更早版本中,请使用 代替 .SpringApplicationBuilder#contextClasscontextFactory

我们在这里声明了2个类:(主应用程序类具有注释)和(具有和),第一个类将启动整个上下文,而后者只会启动Liquibase运行迁移所需的bean。Application@SpringBootApplicationLiquiBaseInit@DataSourceAutoConfiguration@LiquibaseAutoConfiguration

在 main 函数中,我们检查参数数组是否有字符串,如果它在那里,我们将在类外启动应用程序上下文。dbinitLiquiBaseInit

现在,您可以使用 jar 文件运行迁移,如下所示:

java -jar hello-world.jar dbinit

如果您要在 Kubernetes 中运行您的应用程序,您可能还需要在我的博客中查看这篇文章: https://blog.monosoul.dev/2021/12/26/using-liquibase-with-kubernetes/ .


答案 2

您可以使用不同的Spring配置文件:例如,使用名为“init”的配置文件,它将激活“liquibase”配置文件。

application.yml: (默认情况下禁用 Liquibase)

spring:
  liquibase:
    enabled: false

application-init.yml:(不运行Web容器,所以spring会在启动后自动关闭)

spring:
  profiles:
    include: liquibase
  main:
    web-application-type: none

spring-liquibase.yml: (启用 liquibase)

spring:
  liquibase:
    enabled: true
    change-log: classpath:/db/changelog/changelog.xml

此设置允许您将 Liquibase 作为 init 容器(spring.profiles.active=init)运行,但如果您愿意,您仍然可以将 Liquibase 作为 Web 应用程序的一部分运行 (spring.profiles.active=liquibase)。


推荐