MigrationApplication.java

package com.project.authmigration;

import com.project.auth.config.persistence.MigrationProperties;
import org.flywaydb.core.Flyway;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import javax.sql.DataSource;

@SpringBootConfiguration
@EnableAutoConfiguration
@EnableConfigurationProperties(MigrationProperties.class)
@Import(MigrationApplication.MigrationConfiguration.class)
public class MigrationApplication {

    private static final String AUTOCONFIGURATION_EXCLUSIONS = String.join(
            ",",
            "org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration",
            "org.springframework.boot.data.jpa.autoconfigure.DataJpaRepositoriesAutoConfiguration"
    );

    public static void main(String[] args) {
        SpringApplicationBuilder builder =
                new SpringApplicationBuilder(MigrationApplication.class);
        builder
                .web(WebApplicationType.NONE)
                .properties("spring.autoconfigure.exclude=" + AUTOCONFIGURATION_EXCLUSIONS)
                .run(args);
    }

    @Configuration(proxyBeanMethods = false)
    static class MigrationConfiguration {

        private static final Logger log = LoggerFactory.getLogger(MigrationConfiguration.class);

        @Bean
        Flyway flyway(DataSource dataSource, MigrationProperties migrationProperties) {
            return Flyway.configure()
                    .dataSource(dataSource)
                    .locations(migrationProperties.location())
                    .defaultSchema(migrationProperties.schema())
                    .schemas(migrationProperties.schema())
                    .load();
        }

        @Bean
        ApplicationRunner migrationRunner(
                Flyway flyway,
                MigrationProperties migrationProperties,
                ConfigurableApplicationContext applicationContext
        ) {
            return args -> {
                log.info(
                        "Flyway migration app started: location={} schema={}",
                        migrationProperties.location(),
                        migrationProperties.schema()
                );
                flyway.migrate();
                log.info("Flyway migration app completed successfully");

                int exitCode = SpringApplication.exit(applicationContext, () -> 0);
                System.exit(exitCode);
            };
        }
    }
}