我知道这是一个老问题,但万一其他人偶然发现它,这可能很有用。
你可以为应用定义一个命令行参数,该参数将用于仅启动将运行迁移的应用上下文的一部分。
下面是 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#contextClass
contextFactory
我们在这里声明了2个类:(主应用程序类具有注释)和(具有和),第一个类将启动整个上下文,而后者只会启动Liquibase运行迁移所需的bean。Application
@SpringBootApplication
LiquiBaseInit
@DataSourceAutoConfiguration
@LiquibaseAutoConfiguration
在 main 函数中,我们检查参数数组是否有字符串,如果它在那里,我们将在类外启动应用程序上下文。dbinit
LiquiBaseInit
现在,您可以使用 jar 文件运行迁移,如下所示:
java -jar hello-world.jar dbinit
如果您要在 Kubernetes 中运行您的应用程序,您可能还需要在我的博客中查看这篇文章: https://blog.monosoul.dev/2021/12/26/using-liquibase-with-kubernetes/ .