首页 文章

Spring Boot 2.1.0与Flyway 4.2.0

提问于
浏览
1

我想将我的新项目升级到Spring Boot 2.1.0版本,但我受限于Oracle 11数据库,它受到 Flyway 4.2.0 库的支持 . 一切都在Spring Boot 2.0.5版本上正常运行,但是当转移到 2.1.0 版本时,我收到此错误:

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

POM配置如下:

<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>

更新

我能够通过@Configuration(或者当然是添加到主类)解决问题,但问题是它的错误或功能?在2.1.0版之前,所有内容都是通过自动配置完成的,并且开箱即用 .

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

2 回答

  • 0

    我遇到了与PostgreSQL 9.2相同的问题,并使用以下类来解决问题 .

    请注意,您可能会忽略可能在Spring Boot属性中设置的所有自定义属性,因为它会替换您自己的整个Flyway自动配置 . 因此,您可能需要添加一些额外的代码以满足您的需求 .

    @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:这是Kotlin代码,但你应该能够很容易地将它翻译成Java .

  • 2

    我为Spring Boot 2.1.1做了配置,并且还必须重新定义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");
            }
    
        }
    }
    

相关问题