问题 当Flyway无法在Spring Boot上运行时如何调试?


我正在使用Maven和Spring Boot。我使用运行应用程序 mvn spring-boot:run

https://flywaydb.org/documentation/plugins/springboot 说Flyway应该在Spring Boot启动时调用。

所以我的pom.xml包含对Flyway的依赖。

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>4.1.2</version>
</dependency>

我第一次运行Maven命令时它下载了Flyway的东西,所以我认为依赖是有效的。

我有以下文件:

./src/main/resources/db/migration/V123__foo.sql
./src/main/resources/application.properties

上面的文章暗示它应该“正常工作”,但我不明白它会在哪里找到数据库的JDBC URL。所以我添加了以下内容 application.properties 文件:

flyway.url=jdbc:postgresql://localhost:5432/services?user=postgres&password=postgres
flyway.enabled=true

当Spring Boot启动(并加载并使我的Web应用程序可用)时,没有来自Flyway的日志。我认为Flyway被忽略了。

我能做什么?或者,更一般地说,我将如何自己调试此问题?


12006
2018-04-19 13:00


起源

flyway默认使用指定的普通数据源 spring.datasource 属性一般不需要额外的属性。如果你真的想为flyway使用单独的URL和用户,你需要 flyway.url 同 flyway.username 和 flyway.password 而不是嵌入在URL中。接下来确保你有一个数据库驱动程序,否则没有检测到JDBC,也不会运行任何东西(没有JDBC它将无法工作)。 - M. Deinum
感谢您的建议。虽然没有错误,应用程序“运行”(只是没有调用Flyway),我怀疑(希望?)如果数据源错误(例如没有JDBC驱动程序)那么它会打印错误,或者我错了那个假设? - Adrian Smith
如果您已经在使用数据源,那么默认情况下将使用该数据源。你还期待看到什么?记录取决于您的loglevel如果高(WARN或其他),您将看不到任何东西。您可能希望检查数据库的内容,而不是依赖于日志记录。 - M. Deinum
我目前没有使用数据源(这是一个新项目)。根据 docs.spring.io/spring-boot/docs/current/reference/html/... “或者你可以通过在外部属性中设置flyway。[url,user,password]来使用Flyway的原生DataSource。”因此,设置flyway.xx属性并运行Spring Boot应用程序不仅不会记录,也不会影响数据库。 (如果我使用Maven的Flyway插件,在构建期间迁移,那么数据库将被迁移,所以我认为迁移文件是正确的位置。但我希望在Spring Boot启动时) - Adrian Smith
正如我在第一条评论中所述,只有在您使用数据源时才会起作用。如果你不是它什么都不做。 flyway配置取决于数据源的可用性。如果那不利用飞路将被禁用。 - M. Deinum


答案:


没有人发布答案,所以我会发布我发现的内容。

M. Deinum在对这个问题的评论中确实是正确的,问题是缺乏数据来源。

我最初的问题是调试此类问题的方法应该是什么。显然有一个选择是发布到stackoverflow :)但我想知道如何自己做。

Spring Boot有许多类,它们会查看您的代码和类路径,并采取适当的行动。例如,有些类为规则提供实现,例如“如果Flyway在路径上,并且有数据源,则执行Flyway”。在我的情况下,该规则没有被触发,因为我没有数据源。

不是你编写的代码称为Spring Boot的情况,反之亦然,Spring Boot(代码外部)检查你的代码并根据规则决定做什么。这种架构被称为 在远处行动。远距离操作的主要问题是调试非常困难。

找到解决方案的唯一真正方法,就是我确认M. Deinum的诊断方法,就是阅读Spring Boot源代码并理解用于创建Spring Boot代码的注释。

从源代码到 Spring Boot的Flyway集成 我们看

@ConditionalOnClass(Flyway.class)
@ConditionalOnBean(DataSource.class)

这意味着“如果Flyway在类路径上,并且如果有可用的DataSource bean,则会执行此代码;否则它将无法执行”。

因此,“如何调试此问题”这一问题的答案是,除了读取Spring Boot的源代码并了解它是如何工作之外,没有其他机制。

如果你想避免这种问题,你必须避免通过“远程操作”工作的框架,包括Spring Boot。


12
2018-06-08 14:51



不幸的是链接“Spring Boot的Flyway集成“破了。我想我正面对 同样的问题 飞路不会被春天跑。 - Stefan Falk
感谢抬头@StefanFalk。我现在纠正了。 - Adrian Smith