web-dev-qa-db-ja.com

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>

最初に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は無視されていると思います。

私に何ができる?または、より一般的には、この問題を自分でデバッグするにはどうすればよいですか?

22
Adrian Smith

誰も答えを投稿していないので、私が見つけたものを投稿します。

M. Deinumは質問へのコメントで確かに正しかった、問題はデータソースの欠如でした。

私の最初の質問は、この種の問題をデバッグするためのアプローチはどうあるべきかということでした。明らかに1つのオプションはstackoverflowに投稿することです:)しかし、私はそれを自分で行う方法を知りたかったです。

Spring Bootには、コードとクラスパスを調べて適切に動作するいくつかのクラスがあります。たとえば、「Flywayがパス上にあり、データソースがある場合は、Flywayを実行する」のようなルールの実装を提供するクラスがあります。私の場合、データソースがないため、このルールはトリガーされませんでした。

作成するコードがSpring Bootを呼び出すのではなく、その逆です。SpringBoot(コードの外部)がコードを検査し、ルールに基づいて実行することを決定します。このアーキテクチャは 距離でのアクション として知られています。離れた場所でのアクションの主な問題は、デバッグが非常に難しいことです。

ソリューションを見つける唯一の実際の方法であり、M。Deinumの診断を確認する方法は、Spring Bootのソースコードを読み、Spring Bootコードの作成に使用される注釈を理解することでした。

ソースコードから Spring BootのFlyway統合 まで

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

これは、「Flywayがクラスパス上にあり、利用可能なDataSource Beanがある場合、このコードは実行されます。それ以外の場合は、黙って実行されません。」.

したがって、「この問題をデバッグする方法」という質問に対する答えは、Spring Bootのソースコードを読み取って、それがどのように機能するかを見つける以外にメカニズムはないということです。

この種の問題を回避したい場合は、「遠くでのアクション」を介して機能するフレームワークを回避する必要があります。これには、Spring Bootが含まれます。

24
Adrian Smith