Flyway 8.2.0から、クラスパスにMySQLドライバーを含まないといけなくなった

こんにちは。 エキサイト株式会社の三浦です。

みなさんはFlywayを知っているでしょうか?

FlywayはJavaでデータベースのマイグレーションを行ってくれるアプリケーションで、データベースを扱うのであればぜひ入れておきたいものの一つです。

このFlywayは現在でも継続的に開発が行われているのですが、先日一気にバージョンを上げたときにあるエラーが発生しました。

今回は、そのエラーについて説明します。

以前のFlywayの設定方法

前提として、データベースにはMySQLを使っているとします。

バージョンアップ前は、Flywayを以下のようにGradleで設定していました。

以前の設定方法

plugins {
    id "org.flywaydb.flyway" version "7.15.0"
}

これで問題なく動きます。

先日、バージョンアップする機会があったので、以下のように設定しました。

以前の設定方法そのままにバージョンアップ

plugins {
    id "org.flywaydb.flyway" version "9.15.2"
}

一見問題なさそうですが、これを実行すると以下のようなエラーが発生します。

No database found to handle jdbc:mysql://127.0.0.1:3306/...

バージョンを上げた以外に変更はないはずですが、何が起きたのでしょうか?

Flyway 8.2.0以降の設定方法

実は、公式ドキュメントに以下のように載っています。

documentation.red-gate.com

Flyway 8.2.0 (2021-11-30)

Breaking changes

Removing MySQL Driver from inclusion in Flyway distribution due to License. MariaDB will be used as fallback driver if no MySQL driver is present on the Classpath.

つまり、今まではFlyway自体にMySQLドライバーが含まれていたのが含まれなくなったので、自分でセットする必要が出てきたということです。

そこで、以下のように設定すれば問題なく動くようになります。

Flyway 8.2.0以降の設定方法

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.flywaydb:flyway-mysql:9.15.2'
    }
}

plugins {
    id "org.flywaydb.flyway" version "9.15.2"
}

最後に

どんなアプリケーションでも、このようなBreaking Changeはあるものです。

エラーが起きた場合は公式ドキュメントを調べてみるのが第一歩でしょう。

この記事が、同じところで詰まってしまった人の助けになれば幸いです。