Webエンジニア

【Spring Boot】Spring Boot2.1 + MariaDB でflyway6.0 以降を動かすにはmariadb-java-clientを2.3以下にする

Spring Boot2.1+mariaDBでflyway導入を試したときのメモ。厳密には

「アプリケーションにflyway-coreの依存を追加して動かすには」

が正しいかも。

スポンサーリンク

環境

  • Spring Boot: 2.1.4.RELEASE
  • Maria DB: 10.4
  • mariadb-java-client: 2.4.3

経緯

上記構成でSpring BootのアプリケーションにDBマイグレーションツールのflywayを導入しようとしてみた。

// build.gradle
implementation 'org.flywaydb:flyway-core:5.2.4'

バージョンは5系。

 

すると、下記のようなエラーが出てアプリケーションが起動出来ない。

Caused by: org.flywaydb.core.api.FlywayException: Unsupported Database: MariaDB 10.4

どうやらJDBCドライバ側(mariadb-java-client)のバージョンで動作の違いがあるらしい。

MariaDB not recognized with MariaDB JDBC driver 2.4.0 #2289
https://github.com/flyway/flyway/issues/2289

Flyway doesn’t support Mariadb 10.3 by using latest jdbc-driver #2339
https://github.com/flyway/flyway/issues/2339

とあるように、mariadb-java-client が2.4.0以上のバージョンだとサーバタイプ(?)として「MariaDB」と返す。
今までは「MySQL」と返していたため、flyway側が対応出来ておらずエラーになる。

flyway側がサーバタイプとして「MariaDB」を返してくるものに対応しなければならない。

 

上記サーバタイプの対応が含まれているバージョンはflyway6.0以降になる。

// build.gradle
implementation 'org.flywaydb:flyway-core:6.5.0'

これで解決!と思いきや、今度は違うエラーが出てまたコケる。

Caused by: java.lang.TypeNotPresentException: Type org.flywaydb.core.api.callback.FlywayCallback not present

残念ながらSpring Boot2.1系ではflyway6.0系に対応していない。
対応したのは2.2以降とのこと。
https://spring.io/blog/2019/10/16/spring-boot-2-2-0

対応策

Spring Boot2.2 以降にバージョンアップする

Spring Boot2.2以降にバージョンを上げればflyway6.0も使える。

また、JDBCドライバであるmariadb-java-clientもバージョンを下げずに使うことが出来る。

mariadb-java-client のバージョンを下げる

Spring Bootのバージョンを上げるには労力がいるので、Spring Boot2.1のままにして対応する。

前述の通りmariadb-java-client のバージョンを2.3以下にすることでSpring Boot2.1 + Flyway6.0に対応出来る。

おまけ

build.gradleからflyway-coreの依存を外してGradleプラグインのflywayだけにする。
これでアプリケーション起動時にflywayのマイグレーションは走らなくなる。

// build.gradle
plugins {
    id "org.flywaydb.flyway" version "6.5.0"
}

flyway {
    url = 'jdbc:mariadb://localhost:3306'
    user = 'root'
    password = 'password'
    schemas = ['xxxx']
    baselineVersion = '0.0.1'
    baselineOnMigrate = true
    locations = ['filesystem:src/main/resources/db/migration/xxxx']
}

起動時にマイグレーションファイルが自動で読み込まれるのは場合によっては煩わしい。

flyway-coreではなくGradleプラグインとしてflywayを用意しておけば、任意のタイミングでマイグレーション出来る。

コメント

タイトルとURLをコピーしました