web-dev-qa-db-fra.com

Comment déboguer lorsque Flyway ne fonctionne pas sur Spring Boot?

J'utilise Maven et Spring Boot. J'exécute l'application en utilisant mvn spring-boot:run.

https://flywaydb.org/documentation/plugins/springboot indique que Flyway devrait être appelé au démarrage de Spring Boot.

Donc, mon pom.xml contient la dépendance à Flyway.

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>4.1.2</version>
</dependency>

La première fois que j'ai exécuté la commande Maven au-dessus, elle a téléchargé des trucs Flyway, donc je pense que la dépendance fonctionne.

J'ai les fichiers suivants:

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

L'article ci-dessus impliquait qu'il devrait "simplement fonctionner", mais je ne comprends pas où il trouverait l'URL JDBC de la base de données. J'ai donc ajouté ce qui suit au application.properties fichier:

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

Lorsque Spring Boot démarre (et charge et met à disposition mon application Web), il n'y a pas de journaux de Flyway. Je pense que Flyway est ignoré.

Que puis-je faire? Ou, plus généralement, comment procéder pour déboguer moi-même ce problème?

22
Adrian Smith

Personne n'a posté de réponse donc je posterai ce que j'ai découvert.

M. Deinum avait en effet raison dans ses commentaires sur la question, le problème était le manque de source de données.

Ma question initiale était quelle devrait être l'approche pour déboguer ce genre de problème. Évidemment, une option consiste à publier sur stackoverflow :) Mais je voulais savoir comment le faire moi-même.

Spring Boot a un certain nombre de classes qui examinent votre code et votre chemin de classe et agissent de manière appropriée. Par exemple, il existe des classes fournissant des implémentations aux règles comme "si Flyway est sur le chemin, et qu'il y a une source de données, alors exécutez Flyway". Cette règle n'a pas été déclenchée dans mon cas, car je n'avais pas de source de données.

Ce n'est pas le cas que le code que vous écrivez appelle Spring Boot, c'est l'inverse, Spring Boot (externe à votre code) inspecte votre code et décide quoi faire en fonction des règles. Cette architecture est connue sous le nom de action à distance . Le principal problème avec une action à distance est qu'il est très difficile à déboguer.

La seule vraie façon de trouver la solution, et c'est la façon dont j'ai vérifié le diagnostic de M. Deinum, est de lire le code source de Spring Boot et de comprendre les annotations utilisées pour créer le code de Spring Boot.

Du code source à intégration Flyway de Spring Boot nous voyons

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

Cela signifie "ce code sera exécuté si Flyway est sur le chemin de classe, et s'il y a un bean DataSource disponible, sinon il ne sera pas exécuté en silence".

Ainsi, la réponse à la question "comment déboguer ce problème" est qu'il n'y a pas d'autre mécanisme que de lire le code source de Spring Boot et de savoir comment cela fonctionne.

Si vous voulez éviter ce genre de problème, vous devez éviter les frameworks qui fonctionnent via "l'action à distance", et cela inclut Spring Boot.

24
Adrian Smith