Spring Boot中Java-based Flyway Migration运行失败求助
我已经花了约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

