스프링 부츠: 앱을 시작하지 않고 리퀴베이스 이행 실행
Spring Boot에서 설명서는 앱 시작 시 마이그레이션을 실행하도록 권장하는 것으로 보입니다.
이것은 괜찮지만, 때때로 앱 부팅 시 제가 신경쓰고 싶지 않은 부작용/의존성이 있을 수 있습니다.그냥 이행을 스스로 실행하고 싶을 뿐입니다.앱을 실행하지 않고 로컬 개발 데이터베이스를 설정하기만 하면 됩니다.
이에 비해 Dropwizard에서는 다음과 같은 앱에 대한 기본 제공 인수를 사용하여 마이그레이션만 실행하는 것이 간단합니다.
java -jar hello-world.jar db migrate helloworld.yml
Spring Boot에 준하는 것이 있습니까?아니면 그냥 쓰러져서 직접 리퀴바제를 달면 되는 건가요?
저는 직접적인 답변에 관심이 있지만 더 높은 수준의 오해도 하고 있습니다.예를 들어, 아직 깨닫지 못한 이유로 스타트업에서 실행하는 이 접근법이 일반적으로 '더 나은' 것이므로, Spring Boot을 통해 디자인 선택으로만 이 방법을 사용하는 것이 좋습니다.
다른 스프링 프로파일을 사용할 수 있습니다.예를 들어 'init'라는 프로파일을 사용하여 'liquibase' 프로파일을 활성화합니다.
application.yml: (디폴트로는 Liquibase를 무효로 합니다)
spring:
liquibase:
enabled: false
application-init.yml: (웹 컨테이너를 실행하지 않으므로 시작 후 스프링이 자동으로 닫힙니다.)
spring:
profiles:
include: liquibase
main:
web-application-type: none
봄철 병yml: (리퀴바아제
spring:
liquibase:
enabled: true
change-log: classpath:/db/changelog/changelog.xml
이 셋업에서는 리키바제를 초기 컨테이너(spring.disc.active=init)로 실행할 수 있지만, 원하는 경우 웹 앱(spring.disc.active=springibase)의 일부로 리키바제를 실행할 수 있습니다.
오래된 질문인 건 알지만, 혹시 다른 사람이 실수하면 도움이 될 수도 있어요.
앱에 대한 명령줄 인수를 정의할 수 있습니다. 이 인수를 사용하여 마이그레이션을 실행할 앱 컨텍스트의 일부만 스핀업할 수 있습니다.
다음은 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개의 클래스가 선언되어 있습니다.Application
(메인 앱클래스는@SpringBootApplication
주석) 및LiquiBaseInit
(가져 있다@DataSourceAutoConfiguration
그리고.@LiquibaseAutoConfiguration
첫 번째 것은 전체 컨텍스트를 스핀업하고, 두 번째 것은 Liquibase의 이행에 필요한 콩만 스핀업합니다.
에 문자열이 있는지 합니다.dbinit
에는 ' 콘텍스트'를 '어플리케이션 콘텍스트는 '어플리케이션 는 '어플리케이션 컨텍스트'입니다.LiquiBaseInit
를 누릅니다
이제 다음과 같이 jar 파일을 사용하여 마이그레이션을 실행할 수 있습니다.
java -jar hello-world.jar dbinit
Kubernetes에서 앱을 실행할 예정이라면 제 블로그에서 https://blog.monosoul.dev/2021/12/26/using-liquibase-with-kubernetes/도 확인해 보시기 바랍니다.
이 답변은 리키베이스 다음에 이어지는 후크를 언급하고 있습니다.이 질문에서는 데이터베이스(아마도 테스트 값 또는 기본값)를 입력하기 위해 사용되었습니다.
@Bean
@DependsOn("liquibase")
public YourBean yourBean() {
return new YourBean();
}
static class YourBean {
@PostConstruct
public void shutdown() {
// Exit your application here.
);
}
}
잘 될 거야.모르겠어요, 아마 액상 베이스 모드에 접속해서 "만들기"만 하면 종료될 거예요.
일반적으로 Spring Boot을 사용하고 있고 모든 것이 설정되어 있는 경우에는 앱 시작 시 마이그레이션을 실행하는 것이 더 쉬울 수 있습니다.그런 다음 앱을 정지하면 됩니다.
그러나 Spring Boot 앱 없이 이행을 실행하고 싶다면 Liquibase Gradle 및 Maven 플러그인을 사용할 수 있습니다.https://github.com/liquibase/liquibase-gradle-plugin
이 경우 플러그인이 데이터베이스에 연결할 수 있도록 애플리케이션 구성 외에 다른 구성 파일에 데이터베이스 자격 증명을 설정해야 합니다.
이를 위해 이행 생성뿐만 아니라 수동으로도 적용할 수 있는 자체 스크립트를 작성했습니다.단, gradle에서만 적용할 수 있습니다.https://github.com/Wissance/SpringUu 를 참조해 주세요.
업데이트를 적용하려면 다음 명령을 사용합니다.
.\gradlew.bat update -PrunList='changesApply'
db 연결을 지정하려면 그라들 섹션 변경 편집적용
툴에 대한 자세한 내용은 다음 문서를 참조하십시오.
https://m-ushakov.medium.com/code-first-with-spring-boot-hibernate-and-liquibase-48f5c9998d95
maven liquibase 플러그인을 설정 및 구성할 수 있습니다.https://docs.liquibase.com/tools-integrations/maven/commands/home.html
스프링 부트 앱 자체를 시작하지 않고 이행을 사용할 수 있습니다.
빌드 아티팩트 또는 이와 유사한 개별 작업의 일부로 설정할 수 있습니다.
언급URL : https://stackoverflow.com/questions/49532668/spring-boot-run-liquibase-migrations-without-starting-app
'programing' 카테고리의 다른 글
Spring Boot 2.0.0, Data Source Builder를 autoconfigure jar에서 찾을 수 없습니다. (0) | 2023.03.06 |
---|---|
URL에서 #pretty photo를 삭제하는 방법 (0) | 2023.03.06 |
WooCommerce에서 모든 제품 카테고리 가져오기 (0) | 2023.03.06 |
Angular에서의 비싱글톤 서비스JS (0) | 2023.03.06 |
타이프스크립트:유형 X에는 유형 Y 길이, 팝, 푸시, 콘캣 등의 속성이 없습니다.[2740] (0) | 2023.03.06 |