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

Adr*_*ith 19 flyway spring-boot

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

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

我有以下文件:

./src/main/resources/db/migration/V123__foo.sql
./src/main/resources/application.properties
Run Code Online (Sandbox Code Playgroud)

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

flyway.url=jdbc:postgresql://localhost:5432/services?user=postgres&password=postgres
flyway.enabled=true
Run Code Online (Sandbox Code Playgroud)

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

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

Adr*_*ith 22

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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