現象
- SpringBootでアプリケーションを作成
- ビルドはGradle(Mavenでも変わらないと思います)
- GradleからFlywayを操作したくて設定を記述
- flyway clean を実行したところ
No database found to handle
というエラーが出て実行出来ない - DB設定は正しいはず(正しかった)
- ※ 依存のバージョンは読み替えてください
解決方法
build.gradleのpluginsの前に下記を記入する必要がある
buildscript {
dependencies {
classpath("org.flywaydb:flyway-database-postgresql:10.7.2")
}
}
エラー全文
Execution failed for task ':flywayClean'.
> Error occurred while executing flywayClean
No database found to handle jdbc:postgresql://localhost:5432/postgres
build.gradle全文
buildscript {
dependencies {
classpath("org.flywaydb:flyway-database-postgresql:10.7.2")
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.2'
id 'io.spring.dependency-management' version '1.1.4'
id "org.flywaydb.flyway" version "10.7.2"
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'
// https://mvnrepository.com/artifact/org.flywaydb/flyway-core
implementation 'org.flywaydb:flyway-core:10.7.2'
// https://mvnrepository.com/artifact/org.flywaydb/flyway-database-postgresql
runtimeOnly 'org.flywaydb:flyway-database-postgresql:10.7.2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
flyway {
url = 'jdbc:postgresql://localhost:5432/postgres'
user = 'postgres'
password = 'example'
locations = ['classpath:db/migration']
cleanDisabled = false
}
何が起こったのか
Flyway10.0 から
データベースサポートが flyway-core から分離されたようです。
これにより各データベースの依存を runtimeOnly で追加しなければならなくなりました。
これは情報があるのでまだわかるのですが、
Gradle からflywayを使用する際はbuildscriptにclasspathを追加しなければならないという情報は下記URLを見ないとわかりませんでした。
メッセージが的外れという話はこのissueでも出ているのでいずれ改善があるかもしれません。
SpringBootのGradleプロジェクトでFlywayを使用する際に行う設定
これまでの設定
- plugins に flyway の設定を追加
id "org.flywaydb.flyway" version "10.7.2"
- dependencies に flyway-core を追加
implementation 'org.flywaydb:flyway-core:10.7.2'
- flyway のスクリプトを追加
flyway {
url = 'jdbc:postgresql://localhost:5432/postgres'
user = 'postgres'
password = 'example'
locations = ['classpath:db/migration']
cleanDisabled = false
}
※ 話が少し逸れますがいつのバージョンからかうっかり clean コマンドを実行しないようにデフォルト設定でcleanコマンドが使えなくなるcleanDisabledというプロパティが追加されていました。cleanコマンドを使うにはこれを無効化する必要があります。
新たに追加する必要のある設定
- buildscriptのdependenciesでflywayのDBへのclasspath(postgresqlの場合は
flyway-database-postgresql
を設定(MySQLなど他のDBでも同様)
buildscript {
dependencies {
classpath("org.flywaydb:flyway-database-postgresql:10.7.2")
}
}
- dependenciesにDBの依存を追加
runtimeOnly 'org.flywaydb:flyway-database-postgresql:10.7.2'
runtimeOnly 'org.flywaydb:flyway-database-postgresql' を設定しなかったときのエラーメッセージ
エラーメッセージだけを見てdb向けの依存が無いということを見抜くのは難しいです
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unsupported Database: PostgreSQL 15.2