2017-04-19 82 views
7

我正在使用Maven和Spring Boot。我使用mvn spring-boot:run运行应用程序。如何在Flyway不能在Spring Boot上工作时进行调试?

https://flywaydb.org/documentation/plugins/springboot说Springway启动时应该调用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 

当春天开机启动(个够,让我提供的Web应用程序)没有从迁飞日志。我认为Flyway被忽略。

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

+0

flyway默认使用'spring.datasource'属性指定的普通数据源,通常不需要额外的。如果你真的想使用单独的URL和用户的飞行路线,你需要'flyway.url'与'flyway.username'和'flyway.password',而不是嵌入在URL中。接下来确保你有一个数据库驱动程序,否则没有检测到JDBC,并且没有任何东西会被运行(没有JDBC,它将不起作用)。 –

+0

感谢您的意见。没有错误,应用程序“运行”(没有Flyway被调用),我怀疑(希望?),如果数据源是错误的(例如没有JDBC驱动程序),那么它会打印一个错误,或者我错了那个假设? –

+0

如果您已经在使用数据源,那么默认情况下会使用该数据源。你还期望看到什么?日志记录取决于你的日志级别,如果这很高(警告或某些事情)你不会看到一件事情。而不是依靠日志记录您可能需要检查数据库的内容。 –

回答

8

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

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

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

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

这并不是说你的代码编写调用春季启动,这是周围的其他办法的情况下,春季启动(外部代码)检查你的代码,并决定根据规则什么。这个架构被称为action at a distance。远距离行动的主要问题是调试非常困难。

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

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

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

这意味着“这段代码得到执行,如果是迁徙路线上的类路径,如果有一个DataSource豆可用;否则,它静静地不会得到执行”。

所以回答这个问题:“如何调试这个问题”是,有没有其他比读春天启动的源代码,并找出它是如何工作的机制。

如果你想避免这种问题,你必须避免通过“远距离行动”工作的框架,其中包括Spring Boot。

相关问题