Flyway 在 sbt 中找不到我的迁移文件

Posted

技术标签:

【中文标题】Flyway 在 sbt 中找不到我的迁移文件【英文标题】:Flyway not finding my migrations file in sbt 【发布时间】:2019-05-02 02:31:53 【问题描述】:

我正在尝试应用迁移以在测试中建立 H2 数据库,我的文件夹结构是:

src
- test
-- resources
--- db
---- migration
----- V1_0__init_tables.sql

我的配置设置为指向classpath:db/migration

        Flyway
          .configure()
          .locations(migrateLocations)
          .dataSource(url, user, password)
          .load()
          .migrate() 

当我运行测试时,我得到以下输出

2018-11-29 16:14:14,351 DEBUG [ScalaTest-run] slf4j.Slf4jLog (Slf4jLog.java:45) - Scanning for classpath resources at 'classpath:db/migration' ...
2018-11-29 16:14:14,351 DEBUG [ScalaTest-run] slf4j.Slf4jLog (Slf4jLog.java:45) - Determining location urls for classpath:db/migration using ClassLoader sun.misc.Launcher$AppClassLoader@18b4aac2 ...
2018-11-29 16:14:14,420 WARN  [ScalaTest-run] slf4j.Slf4jLog (Slf4jLog.java:53) - Unable to resolve location classpath:db/migration
2018-11-29 16:14:14,421 DEBUG [ScalaTest-run] slf4j.Slf4jLog (Slf4jLog.java:45) - Scanning for classes at classpath:db/migration

这让我很困惑为什么Flyway 无法找到我的文件。据我所知,我已经按照文档的建议做了所有事情。我的测试最终失败了,因为我的表从未迁移过,因此Slick 找不到。

我的迁移文件中可能存在错误,但我认为Flyway 会为此进行某种日志记录?我没有看到类似的东西。

【问题讨论】:

【参考方案1】:

Spring Boot 2 将spring.flyway.locations=classpath:db/migration 设置为默认值并指向src/main/resources/db/migration 文件夹,无论您是否运行单元测试。您可以将 SQL 文件目录放到文件系统中,然后设置 spring.flyway.locations=filesystem:path/to/yourdir

【讨论】:

【参考方案2】:

您是否有意将迁移文件放在src/test/resources 下?无论如何,我认为 Flyway 不会在那里找到它们,因为您的 classpath:db/migration 很可能会引用 src/main/resources,而不是测试资源。 只需尝试将您的迁移文件放在主要资源下即可。

【讨论】:

【参考方案3】:

可以在项目文件夹内的任何位置添加 sql 迁移脚本,例如在prj_root/resources/migrations 中(其中resourcessrc 文件夹的同级)。 要将其嵌入为资源,它需要在build.sbt

unmanagedResourceDirectories in Compile += baseDirectory.value / "resources"

然后在迁移代码中指定这个位置: Flyway.configure().locations("/migrations")...

在idea中将这个新的资源目录标记为Resources Root也很有意义,但这不是必需的,只是美化。

【讨论】:

以上是关于Flyway 在 sbt 中找不到我的迁移文件的主要内容,如果未能解决你的问题,请参考以下文章

Flyway:在 [classpath:db/migration] 中找不到迁移位置

Flyway 在 Maven 多模块项目中找不到迁移

SBT 在本地 maven 存储库中找不到文件,尽管它在那里

在 Android Studio 插件列表中找不到 sbt

在 IntelliJ IDEA 中找不到 SBT-shell

未找到 Flyway 迁移路径