Как отлаживать, когда Flyway не работает на Spring Boot?
я использую Maven и Spring Boot. Я запускаю приложение с помощью mvn spring-boot:run
.
https://flywaydb.org/documentation/plugins/springboot говорит пролете должен называться по весне начала загрузки.
Итак, мой пом.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
в приведенной выше статье подразумевалось, что он должен "просто работать", но я не понимаю, где он найдет URL-адрес JDBC для базы данных. Поэтому я добавил следующее к :
flyway.url=jdbc:postgresql://localhost:5432/services?user=postgres&password=postgres
flyway.enabled=true
когда Spring Boot запускается (и загружает и делает доступным мое веб-приложение), нет журналов с Flyway. Я думаю, что Flyway игнорируется.
что я могу сделать? Или, в более общем плане,как я сам буду отлаживать эту проблему?
1 ответов
никто не опубликовал ответ, поэтому я опубликую то, что узнал.
М. Deinum был действительно корректен в своих комментариях к вопросу, проблема отсутствия источников данных.
мой первоначальный вопрос заключался в том, каким должен быть подход к отладке такого рода проблем. Очевидно, один из вариантов-опубликовать в stackoverflow:) но я хотел знать, как это сделать сам.
Spring Boot имеет ряд классов, которые смотрят на ваш код и путь к классам и действуют соответственно. Например, существуют классы, предоставляющие реализации правилам типа "Если Flyway находится на пути, и есть источник данных, то выполните Flyway". Это правило не срабатывало в моем случае, потому что у меня не было источника данных.
это не тот случай, когда код, который вы пишете, вызывает Spring Boot, наоборот, Spring Boot (внешний по отношению к вашему коду) проверяет ваш код и решает, что делать на основе правил. Эта архитектура известна как действие на a расстояние. Основная проблема с действием на расстоянии-это очень трудно отлаживать.
единственный реальный способ найти решение, и это был способ, которым я подтвердил диагностику M. Deinum, - прочитать исходный код Spring Boot и понять аннотации, которые используются для создания кода Spring Boot.
из исходного кода интеграция Flyway Spring Boot мы видим
@ConditionalOnClass(Flyway.class)
@ConditionalOnBean(DataSource.class)
Это означает, что "этот код будет выполняться если Flyway находится на пути к классам, и если есть доступный компонент источника данных; в противном случае он молча не будет выполнен".
таким образом, ответ на вопрос "как отладить эту проблему" заключается в том, что нет другого механизма, кроме как прочитать исходный код Spring Boot и узнать, как он работает.
Если вы хотите избежать такого рода проблем, вы должны избегать фреймворков, которые работают через "действие на расстоянии", и это включает в себя Spring Boot.