我正在使用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被忽略了。
我该怎么办?或者,更一般地说,我将如何自己调试此问题?
答案 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。