当Flyway在Spring Boot上不起作用时如何调试?

时间:2017-04-19 13:00:11

标签: spring-boot flyway

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

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

所以我的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被忽略了。

我该怎么办?或者,更一般地说,我将如何自己调试此问题?

1 个答案:

答案 0 :(得分:15)

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

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

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

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

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

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

从源代码到我们看到的Spring Boot's Flyway integration

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

这意味着&#34;如果Flyway在类路径上,并且有可用的DataSource bean,则会执行此代码;否则它会默默地赢得执行&#34;。

问题的答案&#34;如何调试此问题&#34;除了阅读Spring Boot的源代码并了解它是如何工作之外,没有其他机制。

如果你想避免这类问题,你必须避免使用#34;远程操作的框架,包括Spring Boot。