Flyway – инструмент для миграции и версионирования баз данных с открытым исходным кодом.
При обновлении на версию 10.0.0 (2023-10-31) и выше есть масса нюансов что может пойти не так.
Выписал некоторые проблемы и их решения.
«Retired Java 8 from use. Java 17 is now required for development.»
Теперь библиотека требует как минимум Java 17. Необходимо установить JRE версии ≥ 17.
Либо, если проект запускается из IntelliJ IDEA, указать/скачать JRK 17 по пути:
File – Project Structure – Platform Settings – SKDs
Иначе будет ошибка несоответствия class-файлов Flyway, скомпилированных под определенную версию Java, с версией JRE:
Exception in thread “main” java.lang.UnsupportedClassVersionError: org/flywaydb/core/Flyway has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
Тут можно узнать соответствие версий класс-файлов и версий Java.
«Move packages and groupID from ‘org.flywaydb.enterprise’ to ‘com.redgate.flyway’. Duplicate packages will be deployed to ‘org.flywaydb.enterprise’ until a future release.»
Необходимо у зависимостей изменить groupId с org.flywaydb.enterprise
на com.redgate.flyway
.
Также описано тут: Accessing Older Versions of Flyway Engine.
Хотя для Flyway 11.3.3 пакеты все еще доступны с groupId com.redgate.flyway
.
«Modularized database support in Flyway to allow greater flexibility. This includes; DB2, Derby, HSQLDB, Informix, PostgreSQL, CockroachDB, Redshift, SAP HANA, Snowflake and Sybase ASE. See Database Support page for your database for module dependency. If you are including Flyway in your project, either as a dependency or via the maven and gradle plugins please include the respective database module in your project configuration.»
Поддержка разных БД стала модульной. Например, для Postgresql теперь кроме либы с ODBC драйвером, нужен дополнительный модуль flyway-database-postgresql
(описание, релизы):
1 |
implementation "org.flywaydb:flyway-database-postgresql" |
или
1 |
implementation "com.redgate.flyway:flyway-database-postgresql" |
Иначе будет ошибка (issue):
Unsupported Database: PostgreSQL 16.*
Проблема со сборкой в fat.jar
Самая коварная шляпа. На версиях Flyway ≥ 10.*, при сборке проекта в fat.jar (командой gradlew buildFatJar
), имена файлов миграций перестают проходить валидацию (issue).
Возникает ошибка:
2 SQL migrations were detected but not run because they did not follow the filename convention.
Set ‘validateMigrationNaming’ to true to fail fast and see a list of the invalid file names.
или
Exception in thread “main” org.flywaydb.core.api.FlywayException: Invalid SQL filenames found:
Unrecognised migration name format: migration_file_name.sql
При этом если запускать проект из IDE, то все работает, валидация файлов проходит успешно.
Причина кроется в плагине shadowJar
, в конфигурации которого не хватало выполнения объединения файлов дескрипторов служб.
Этот плагин предназначается для сворачивания всех зависимостей и кода проекта в один Jar-файл (оф.сайт, github, описание на сайте Gradle).
При этом в IntelliJ IDEA для проекта на Ktor НЕ требуется добавлять это плагин в gradle вручную, например так:
1 2 3 |
plugins { id("com.gradleup.shadow") version "8.3.6" } |
При выполнении gradlew buildFatJar
плагин автоматически выполняется “под капотом”.
Решение: в build.gradle.kts
добавить таск для плагина shadowJar
:
1 2 3 4 5 |
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar ... tasks.named<ShadowJar>("shadowJar") { mergeServiceFiles() } |