当前位置: 首页 > 知识库问答 >
问题:

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

姚星河
2023-03-14

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

这很好,但有时应用程序启动可能会有副作用/依赖性,我不想麻烦-我只想自己运行迁移。设想一下,只需建立一个本地开发人员数据库,就可以在其中闲逛,甚至不用运行应用程序。

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

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

Spring靴有什么等价物吗?还是我必须直接去喝liquibase?

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

共有3个答案

龚奇逸
2023-03-14

您可以使用不同的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)。

邬弘化
2023-03-14

这个答案提到了一个追着液化的钩子。在这个问题中,它被用来填充数据库,可能是测试值或默认值。

@Bean
@DependsOn("liquibase")
public YourBean yourBean() {
    return new YourBean();
}

static class YourBean {

    @PostConstruct
    public void shutdown() {
         // Exit your application here.
         );
    }

}

这可能管用。我不知道,你可能甚至可以访问liquibase模式,只有在“创建”时才会关闭

傅自明
2023-03-14

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

你可以为你的应用程序定义一个命令行参数,你将使用它来启动将运行迁移的应用程序上下文的一部分。

以下是科特林的一个例子:

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)
            .contextClass(AnnotationConfigApplicationContext::class.java)
            .run(*args)
        return
    }

    runApplication<Application>(*args)
}

我们在这里声明了2个类:Application(主应用类具有@SpringBootApplication注释)和LiquiBaseInit(具有@DataSourceAutoConfigura@Liquibase AutoConfigura),第一个将旋转整个上下文,而后者只会旋转Liquibase运行迁移所需的bean。

在main函数中,我们检查arguments数组是否有字符串dbinit,如果有,我们从LiquiBaseInit类中启动一个应用程序上下文。

现在,您可以像这样使用jar文件运行迁移:

java -jar hello-world.jar dbinit

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

 类似资料:
  • 我在我的项目中使用带有MongoDb和Elasticsearch的Springboot。当我的Elasticsearch服务器运行时,我的Springboot应用程序运行良好,但当Elasticsearch服务器停止时,我的Springboot应用程序也无法启动。根据我的项目要求,即使Elasticsearch服务器无法启动,我们的Springboot应用程序仍应运行,因为我们的大多数API都是基

  • 我正试图将运行在tomcat上的现有应用程序更改为SpringBoot。它一直运行到真正的SpringBoot启动。我有一个类似的应用程序运行在SpringBoot上。这就是我知道它一直运行到Springboot的原因。 我的主要方法: 我尝试使用@componentscan运行main方法,该方法具有如下所示的basePackages: 这无济于事。我尝试在main类的顶部添加@SpringBo

  • 问题内容: 我用的是需要挂钩的BabelJS(原名6to5)与运行节点的应用程序es6features: 我打电话来运行我的 app.js6 。我需要安装BabelJS并为我想使用es6features的每个项目提供一个 run.js。 我希望打个电话。如何独立实现该系统(Unix和Windows)? 问题答案: 将and (又名ES6)依赖项添加到应用程序的package.json文件中,并定义

  • 我正在开发一个spring启动应用程序并编写一些junit测试。 但我发现,当我运行任何测试时,tomcat也会启动,这使得这些测试非常缓慢,浪费了很多时间。 当我开发一个SpringMvc应用程序时,junit测试可以在不启动tomcat的情况下运行,这节省了很多时间。 所以,我想问它在那里无论如何要运行启动tomcat的springstart测试?

  • 我有一个带有maven的spring boot应用程序,并使用Hikari数据源连接Mysql数据库。但当我运行spring boot应用程序时,HikariPool关机启动如下: 我将属性文件配置如下,并且可以通过正常使用单元测试来获得数据查询: 任何人都可以为我提供解决此问题的解决方案。谢谢

  • 问题内容: 我是Node的新手,并创建了一个其中包含一些async / await语法的应用程序,如下所示: 它在我的机器上可以正常工作,但是当我部署到Heroku时,由于不支持语法而出现错误: 使Heroku支持此语法的最简单方法是什么? 问题答案: 指定要在package.json中使用的节点版本:https : //devcenter.heroku.com/articles/nodejs-s