Flyway 找不到类路径:db/migrations

Posted

技术标签:

【中文标题】Flyway 找不到类路径:db/migrations【英文标题】:Flyway can't find classpath:db/migrations 【发布时间】:2019-08-15 03:56:15 【问题描述】:

我现在刚刚在 Intellij 中使用 Spring Boot 2.1.3 版和 Flyway 5.2.4 和 Java 11 开始了一个新项目。

在尝试开始我的项目后,我得到了:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flyway' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.core.Flyway]: Factory method 'flyway' threw exception; nested exception is java.lang.IllegalStateException: Cannot find migrations location in: [classpath:db/migration] (please add migrations or check your Flyway configuration)

我有以下文件夹:

如您所见,我有“db/migration”但没有任何迁移,我现在才开始。调试类 FlywayAutoConfiguration 我得到以下信息:

所以,我尝试返回“类路径:”中的所有文件,请参阅:

请注意,我只有“application.properties”文件。

【问题讨论】:

你能帮忙看看这里的类似问题吗:***.com/questions/55772574/… 【参考方案1】:

这不是那么有用或准确的答案。

但是这个问题让你很沮丧,所以我给出了这个解决方案。

注意:很奇怪,但确实如此,有时它不允许复制粘贴,因为您的文件夹创建了 db.migration 并且它包含 db->migration(在这种情况下不一样)。所以每当你从头开始。转到资源文件夹 -> 创建 DB 文件夹 -> 创建迁移文件夹 -> 使用 Version_SubVersion__Name(如下定义)创建数据库文件。

这通常发生在以下情况,

    路径不正确尝试使用设置位置参数值。 db.migrate 文件夹不包含任何文件。 检查文件名:V1_1__(short_desc) 尝试运行使用,mvn compile flyway:migrate

在我的情况下,我已经将 sql 文件放在那里,但它仍然给出同样的错误, 基本上我使用从某处复制粘贴来放置这个 sql 文件。

当我尝试使用 IDE 在同一位置添加一个新文件时(Intellij:右键单击迁移文件夹 -> 新建 -> Flyway 迁移 -> 版本化迁移),然后它会询问我(警告)一些微妙的津贴(通常我们在数据库配置中提到过,我也放在那里),它开始工作了。

【讨论】:

谢谢,文件夹结构对我来说是个问题。 ?? 我有一个名为 db.migrations 的文件夹,而不是两个嵌套文件夹 db 和内部 migrations!一个简单的mv db.migrations db; mkdir db/migrations 就成功了。在 IntelliJ 内部,之前和之后看起来是一样的! 我很想说“谢谢,这解决了我以前从未遇到过的问题”,但遗憾的是,这是我第二次遇到这个问题,你猜我会遇到的现在学会了。谢谢 IntelliJ 今天让这项工作大放异彩...谢谢,这解决了我的问题:-D【参考方案2】:

我相信 Flyway 至少需要一个迁移脚本来初始化。尝试将一个简单的 sql 创建脚本添加到您的迁移文件夹中,然后再试一次。或者,您可以在需要之前禁用 flyway 依赖项。

【讨论】:

谢谢。如何禁用它?我尝试添加 application.yml flyway: baseline-on-migrate: false 但它仍在尝试加载 尝试删除flyway依赖(例如删除maven pom依赖) 依赖来自skipper依赖。如果我排除它给出另一个错误 - ava.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.skipper.server.db.migration.SkipperFlywayConfigurationCustomizer ] 来自 ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2] 这很好。在 application.yml 中添加了 spring: flyway: enabled: false baseline-on-migrate: false【参考方案3】:

Flyway 需要至少一个脚本,禁用它直到你需要它,在 application.properties 文件中使用以下命令

spring.flyway.enabled=false

【讨论】:

【参考方案4】:

我遇到了类似的错误,解决方法如下:我添加了这些命令

spring.flyway.baselineOnMigrate=true
spring.flyway.check-location=true
spring.flyway.locations=classpath:db/migration
spring.flyway.schemas=public
spring.flyway.enabled=true

到 application.properties

【讨论】:

【参考方案5】:

即使您的迁移文件位于 db/migration 文件夹中,flyway 也不会检测到它。

然后您必须通过在 application.properties(或 appliocation.yml)中明确设置位置来解决此问题,方法是添加:

spring.flyway.locations=classpath:db/migration

N.B: 另外你需要至少一个脚本来初始化flyway,你甚至可以放一个空的。但是你需要至少有一个脚本

【讨论】:

【参考方案6】:

正如@Guy 在他的回答中所建议的,我在迁移文件夹中创建了一个 SQL 文件并将其留空。在迁移文件夹 classpath:db/migration 中命名为 v1_0__mock_flyway.sql。错误已解决。

【讨论】:

【参考方案7】:

我有同样的问题。当我创建目录时,我只是输入了db.migration——就像处理包名一样。 InteliJ 会将db.migrationdb/migration 目录显示为db.migration,因此虽然它在IntelliJ 中看起来正确,但flyway 需要后者。

【讨论】:

以上是关于Flyway 找不到类路径:db/migrations的主要内容,如果未能解决你的问题,请参考以下文章

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

在 websphere 上的 flyway 迁移上找不到位置

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

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

在 docker 容器上运行数据库时,Flyway 找不到迁移

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