Springboot外部库Liquibase迁移

Mih*_*tin 5 java module liquibase spring-boot

我有一个外部 SpringBoot 公共库(构建为 )jar和一个包含它的主项目。

外部库需要一组默认数据库表。为此,我设置了 Liquibase。主要项目还使用了 Liquibase。这两个项目都有不同的变更日志文件。假设一个被命名library.xml,另一个被命名main.xml。所有数据库和 Liquibase 属性均在主项目(以及spring.liquibase.change-log=main.xml)中配置。

该库有一个属性:spring.liquibase.change-log=library.xml

我如何告诉 Liquibase“同时运行library.xml并且main.xml”?我想我需要在库项目中配置一些东西,因为主应用程序应该按原样使用它(只需导入和使用它)。

xer*_*593 4

要合并/构建我们的(liquibase)更改日志,我们可以:

  1. 使用(include “属性”(等)(我还是更喜欢这个!)
  2. (使用)定义多个 @Bean SpringLiquibases:

Spring-Boot(2.7.5)解决方案:

(主要项目)application.properties

spring.liquibase.change-log=classpath:/main.xml
# many more with same prefix ...
lib.liquibase.change-log=classpath:/library.xml
# according for lib.liquibase.* ...
Run Code Online (Sandbox Code Playgroud)

主/配置类:

@SpringBootApplication(/* scanBasePackages = "com.example.lib" */)
// We need/want these:
@EnableConfigurationProperties(LiquibaseProperties.class)
public class Demo {

  @Bean // "main" liquibase: 
  // when order matters: @DependsOn("liquibaseLib") 
  @ConfigurationProperties("spring.liquibase") // !
  public SpringLiquibase liquibase( 
      ObjectProvider<DataSource> dataSource,
      @LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource,
      LiquibaseProperties properties) {
    return liqui(dataSource, liquibaseDataSource, properties);
  }

  @Bean // lib liquibase:
  @ConfigurationProperties("lib.liquibase")
  public SpringLiquibase liquibaseLib(
      ObjectProvider<DataSource> dataSource,
      /* alternatively: @MyVeryCustomDataSource ... */
      @LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource,
      LiquibaseProperties properties) {
    return liqui(dataSource, liquibaseDataSource, properties);
  }

  // pstvm...

  private SpringLiquibase liqui(ObjectProvider<DataSource> dataSource,
      ObjectProvider<DataSource> liquibaseDataSource, LiquibaseProperties properties) {
    // trick: Don't use LiquibaseConfiguration as `@Configuration/Bean`
    // , it is not "repeatable" (in regards of liquibase execution;(
    // , but rather as a "utility object"/factory:
    LiquibaseConfiguration helpr = new LiquibaseConfiguration(properties);
    return helpr.liquibase(dataSource, liquibaseDataSource);
  }
}
Run Code Online (Sandbox Code Playgroud)

Demo.java 的标头(包+导入):

package com.example.app;import javax.sql.DataSource; import liquibase.integration.spring.SpringLiquibase; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseConfiguration; import org.springframework.boot.autoconfigure.liquibase.LiquibaseDataSource; import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.DependsOn;

也可以看看。


简单的解决方案

...如2所示:

@SpringBootApplication(/* scanBasePackages = "com.example.lib" */)
// We need/want these:
@EnableConfigurationProperties(LiquibaseProperties.class)
public class Demo {

  @Bean // "main" liquibase: 
  // when order matters: @DependsOn("liquibaseLib") 
  @ConfigurationProperties("spring.liquibase") // !
  public SpringLiquibase liquibase( 
      ObjectProvider<DataSource> dataSource,
      @LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource,
      LiquibaseProperties properties) {
    return liqui(dataSource, liquibaseDataSource, properties);
  }

  @Bean // lib liquibase:
  @ConfigurationProperties("lib.liquibase")
  public SpringLiquibase liquibaseLib(
      ObjectProvider<DataSource> dataSource,
      /* alternatively: @MyVeryCustomDataSource ... */
      @LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource,
      LiquibaseProperties properties) {
    return liqui(dataSource, liquibaseDataSource, properties);
  }

  // pstvm...

  private SpringLiquibase liqui(ObjectProvider<DataSource> dataSource,
      ObjectProvider<DataSource> liquibaseDataSource, LiquibaseProperties properties) {
    // trick: Don't use LiquibaseConfiguration as `@Configuration/Bean`
    // , it is not "repeatable" (in regards of liquibase execution;(
    // , but rather as a "utility object"/factory:
    LiquibaseConfiguration helpr = new LiquibaseConfiguration(properties);
    return helpr.liquibase(dataSource, liquibaseDataSource);
  }
}
Run Code Online (Sandbox Code Playgroud)

关于:

图书馆有一个单一的财产...

希望这是一个测试属性;)!