web-dev-qa-db-fra.com

Spring Boot 2.1.0 avec Flyway 4.2.0

J'aimerais mettre à niveau mes nouveaux projets vers Spring Boot version 2.1.0, mais je suis limité à la base de données Oracle 11, qui est prise en charge par la bibliothèque Flyway 4.2.0 . Tout fonctionne normalement avec la version 2.0.5 de Spring Boot, mais lorsque je passe à 2.1.0 release, le message d'erreur suivant s'affiche: 

Java.lang.NoClassDefFoundError: 
org/flywaydb/core/api/configuration/FluentConfiguration

La configuration de POM est la suivante:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <Java.version>1.8</Java.version>
    <ojdbc6.version>11.2.0.1</ojdbc6.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.Oracle.jdbc</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>${ojdbc6.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>4.2.0</version>
    </dependency>
</dependencies>

METTRE À JOUR

Je suis capable de résoudre le problème via @Configuration (ou bien sûr d'ajouter à la classe principale), mais est-ce que c'est un bogue ou une fonctionnalité? Avant la version 2.1.0, tout était fait via la configuration automatique et tout fonctionnait bien.

@Bean(initMethod = "migrate")
Flyway flyway() {
    Flyway flyway = new Flyway();
    flyway.setBaselineOnMigrate(true);
    flyway.setDataSource("jdbc:Oracle:thin:@localhost:1521:xe", "USER", "PASSWORD1");
    return flyway;
}
6
troger19

J'ai eu le même problème avec PostgreSQL 9.2 et ai utilisé la classe suivante pour résoudre le problème.

Sachez cependant que toutes les propriétés personnalisées que vous pouvez définir dans les propriétés de démarrage printanier seront ignorées, car elles remplacent toute la configuration automatique de Flyway. Il se peut donc que vous deviez ajouter du code supplémentaire pour répondre à vos besoins.

@Configuration
class FlywayConfig {
    @Bean
    fun flyway(dataSource: DataSource): Flyway {
        val flyway = Flyway()
        flyway.dataSource = dataSource
        return flyway
    }

    @Bean
    fun flywayInitializer(flyway: Flyway): FlywayMigrationInitializer {
        return FlywayMigrationInitializer(flyway, null)
    }

    /**
     * Additional configuration to ensure that [EntityManagerFactory] beans depend on the
     * `flywayInitializer` bean.
     */
    @Configuration
    class FlywayInitializerJpaDependencyConfiguration : EntityManagerFactoryDependsOnPostProcessor("flywayInitializer")
}

PS: c'est du code Kotlin, mais vous devriez pouvoir le traduire assez facilement en Java.

2
JB Nizet

J'ai fait la configuration pour Spring Boot 2.1.1 et je devais aussi redéfinir le bean FlywayDefaultDdlModeProvider.

@Configuration
@ConditionalOnProperty(prefix = "spring.flyway", name = "enabled", matchIfMissing = true)
public class LegacyFlywayAutoConfiguration {

    @Bean
    @Primary
    public SchemaManagementProvider flywayDefaultDdlModeProvider(ObjectProvider<Flyway> flyways) {
        return new SchemaManagementProvider() {
            @Override
            public SchemaManagement getSchemaManagement(DataSource dataSource) {
                return SchemaManagement.MANAGED;
            }
        };
    }

    @Bean(initMethod = "migrate")
    public Flyway flyway(DataSource dataSource) {
        Flyway flyway = new Flyway();
        flyway.setBaselineOnMigrate(true);
        flyway.setDataSource(dataSource);
        return flyway;
    }

    @Bean
    public FlywayMigrationInitializer flywayInitializer(Flyway flyway) {
        return new FlywayMigrationInitializer(flyway, null);
    }

    /**
     * Additional configuration to ensure that {@link JdbcOperations} beans depend
     * on the {@code flywayInitializer} bean.
     */
    @Configuration
    @ConditionalOnClass(JdbcOperations.class)
    @ConditionalOnBean(JdbcOperations.class)
    protected static class FlywayInitializerJdbcOperationsDependencyConfiguration
            extends JdbcOperationsDependsOnPostProcessor {

        public FlywayInitializerJdbcOperationsDependencyConfiguration() {
            super("flywayInitializer");
        }

    }
}
0
vargapeti