You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Java-based Flyway Migration运行失败求助

问题:Spring Boot中Java-based Flyway迁移无法执行,文件被过滤

我已经花了约10小时尝试让基于Java的Flyway迁移在Spring Boot中正常运行,多次尝试和搜索后仍未解决。

我需要使用Java-based迁移(后续要处理复杂逻辑,不能用SQL迁移),以下是用Kotlin编写的迁移代码:

package db.migration.kotlin

import org.flywaydb.core.api.migration.BaseJavaMigration
import org.flywaydb.core.api.migration.Context


class V1__create_users_table : BaseJavaMigration() {
    override fun migrate(context: Context) {
        context.connection.use { connection ->
            connection.createStatement().execute("""
            CREATE TABLE users
            (
                id         SERIAL NOT NULL,
                email      TEXT   NOT NULL,
                created_at TIMESTAMP
            );
            """)
        }
    }

}

文件当前放在src/main/resources/db/migration/kotlin目录下。

启动Spring Boot应用后,日志显示迁移文件被过滤,未找到任何迁移:

2024-05-12T00:16:23.743+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.c.i.s.SchemaHistoryFactory           : Default schema: null
2024-05-12T00:16:23.747+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.c.i.c.SqlScriptCallbackFactory       : Scanning for SQL callbacks ...
2024-05-12T00:16:23.747+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.scanner.Scanner        : Filtering out resource: db/migration/kotlin/V2__update_created_at.kt (filename: V2__update_created_at.kt)
2024-05-12T00:16:23.747+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.scanner.Scanner        : Filtering out resource: db/migration/kotlin/V1__create_users_table.kt (filename: V1__create_users_table.kt)
2024-05-12T00:16:23.752+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.command.DbValidate     : Validating migrations ...
2024-05-12T00:16:23.753+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.scanner.Scanner        : Filtering out resource: db/migration/kotlin/V2__update_created_at.kt (filename: V2__update_created_at.kt)
2024-05-12T00:16:23.753+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.scanner.Scanner        : Filtering out resource: db/migration/kotlin/V1__create_users_table.kt (filename: V1__create_users_table.kt)
2024-05-12T00:16:23.753+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.scanner.Scanner        : Filtering out resource: db/migration/kotlin/V2__update_created_at.kt (filename: V2__update_created_at.kt)
2024-05-12T00:16:23.753+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.scanner.Scanner        : Filtering out resource: db/migration/kotlin/V1__create_users_table.kt (filename: V1__create_users_table.kt)
2024-05-12T00:16:23.753+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.scanner.Scanner        : Filtering out resource: db/migration/kotlin/V2__update_created_at.kt (filename: V2__update_created_at.kt)
2024-05-12T00:16:23.754+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.scanner.Scanner        : Filtering out resource: db/migration/kotlin/V1__create_users_table.kt (filename: V1__create_users_table.kt)
2024-05-12T00:16:23.761+05:45  INFO 77861 --- [flyway-java-migration] [           main] o.f.core.internal.command.DbValidate     : Successfully validated 0 migrations (execution time 00:00.008s)
2024-05-12T00:16:23.761+05:45  WARN 77861 --- [flyway-java-migration] [           main] o.f.core.internal.command.DbValidate     : No migrations found. Are your locations set up correctly?
2024-05-12T00:16:23.762+05:45 DEBUG 77861 --- [flyway-java-migration] [           main] o.f.core.internal.command.DbSchemas      : Skipping creation of existing schema: "public"

我的application.yml配置如下:

spring:
  application:
    name: flyway-java-migration
  flyway:
    locations: classpath:db/migration/kotlin

server:
  port: 8080
  shutdown: graceful

logging:
  level:
    org:
      flywaydb: DEBUG

请协助排查问题。


解决方案

1. 修正迁移类的存放路径

Java/Kotlin迁移类是编译后的字节码文件,不是源码文件,不能放在src/main/resources下,必须放在源码目录(src/main/kotlin)中,对应包路径db.migration.kotlin,目录结构应为:

src/main/kotlin/db/migration/kotlin/V1__create_users_table.kt

Flyway扫描的是类路径下已编译的.class文件,你把.kt源码放在resources目录下,Flyway无法识别为可执行的迁移类,因此会被过滤。

2. 调整Flyway配置路径

Java迁移类的扫描路径是包路径,不是资源目录,所以application.yml中的Flyway配置需要修改为:

spring:
  flyway:
    locations: classpath:db.migration.kotlin

或者保持默认(Flyway默认扫描db.migration包),把迁移类移到db.migration包下,配置可以省略。

3. 验证编译结果

启动前确认项目已编译,target/classes/db/migration/kotlin/目录下存在V1__create_users_table.class文件,确保Kotlin代码编译正常。

4. 修正代码语法错误

你的迁移代码里存在语法错误:connection -应该是connection ->,修正后才能正常编译执行。


内容的提问来源于stack exchange,提问作者KapilDev Neupane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:34:57