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

时间:2018-11-29 23:16:33

标签: scala slick flyway

我正在尝试应用迁移以建立测试中的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会为此进行某种日志记录吗?我什么都没看到。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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