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

How to debug when Flyway doesn't work on Spring Boot?

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

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

因此,我的pom.xml包含对Flyway的依赖关系。

1
2
3
4
5
<dependency>
    <groupId>org.flywaydb</groupId>
    flyway-core</artifactId>
    <version>4.1.2</version>
</dependency>

第一次在上面运行Maven命令时,它会下载Flyway内容,因此我认为依赖项是有效的。

我有以下文件:

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

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

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

当Spring Boot启动(并加载我的Web应用程序并使之可用)时,Flyway不会提供任何日志。 我认为Flyway被忽略了。

我能做什么? 或者,更一般而言,我将如何自行调试此问题?


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

Deinum先生在对这个问题的评论中确实是正确的,因为问题是缺乏数据源。

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

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

并非您编写的代码称为Spring Boot,而是相反,Spring Boot(在代码外部)会检查您的代码并根据规则决定要做什么。这种架构被称为远距离行动。远距离动作的主要问题是很难调试。

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

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

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

这意味着"如果Flyway在类路径上,并且有可用的DataSource bean,那么该代码将被执行;否则,它将被静默地执行"。

因此,"如何调试此问题"问题的答案是,除了阅读Spring Boot的源代码并了解其工作方式之外,没有其他机制。

如果要避免此类问题,则必须避免通过"远距离操作"工作的框架,其中包括Spring Boot。