Поддерживает ли flyway sql миграцию в тестовой папке? - PullRequest
4 голосов
/ 07 апреля 2020

Я переношу проект из Spring Boot 1.5.21 в 2.2.5. Я следовал всем инструкциям в руководстве . Однако у меня есть проблема с flyway (обновление с 4.2.0 до 6).

Ранее, когда у меня было sql файлов миграции в src/test/resources/db/migration, flyway запускал их как часть mvn clean install команда. Теперь по какой-то причине он перестал выполнять эти миграции (просто чтобы уточнить, я говорю о maven сборке, а не при запуске приложения).

Я использую maven 3.6.3 и flyway-maven-plugin version 6.0.8 со следующей конфигурацией (некоторые значения являются токенами, которые не имеют отношения к этому вопросу):

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>${flyway.version}</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>migrate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <skip>${db.skip}</skip>
        <url>${db.url}</url>
        <user>${db.username}</user>
        <password>${db.password}</password>
        <locations>
            <location>classpath:db/migration</location>
        </locations>
        <schemas>public,downstream</schemas>
        <outOfOrder>true</outOfOrder>
        <callbacks>
            db.migration.callback.PopulateControlFieldsFlywayCallback,db.migration.callback.UpdateReplicaIdentityFlywayCallback,db.migration.callback.UpdateSchemaHistoryTableFlywayCallback
        </callbacks>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgresql.version}</version>
        </dependency>
    </dependencies>
</plugin>

Почему изменилось поведение? Как вернуться к старому поведению? Я что-то упустил?

1 Ответ

1 голос
/ 19 апреля 2020

Я выкопал в flyway и flyway-maven-plugin колдовства. Я обнаружил, что путь от тега местоположения classpath ищется ClassRealm в классе. И существует две классовые линии: ClassRealm[plugin>org.flywaydb:flyway-maven-plugin:5.0.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@1f89ab83]. ClassRealm - это загрузчик классов, который используется в Maven.

Я выполнил classLoader.getResources('/db/migration') и обнаружил, что он возвращает 2 пути (target/classes/db/migration и target/test-classes/db/migration) для версии плагина mave 4.2.0, но возвращает только 1 путь (target/classes/db/migration) for version 5.0.0`.

Также я обнаружил, что в репозитории flyway-maven-plugin была фиксация для использования maven 3 вместо 2 в maven-plugin версии 4.2.0 и 5.0.0.

Я не нашел точной причины, но, подытоживая все это, я предполагаю, что произошли некоторые изменения в плагине maven (я полагаю, какая-то версия библиотеки ядра maven), в результате чего путь поиска в classpath был изменен.

Я пробовал несколько вариантов возврата старого поведения, но все они не так хороши. Это работа:

  1. Оставайтесь на 4.2. 0 maven-plugin версия (у меня есть домашний проект, в котором я указал flyway 5.0.0 в <dependencies> и использую maven-plugin 4.2.0, и он работает правильно для вас);
  2. Укажите путь к тесту. миграция через <location>filesystem:target/test-classes/db/migration</location> или <location>filesystem:src/test/resources/db/migration</location>

Надеюсь, это вам поможет.

PS Кстати, почему вы используете миграцию в тестовой папке для генерации классов с помощью jooq? Это выглядит очень странно для меня. Вы генерируете классы из одной модели БД, но в PROD у вас будет другая модель БД (поскольку используются миграции только под main). Может стоит подумать и использовать только миграцию в папку main? Если у вас есть некоторые исключения во время генерации jooq, попробуйте исправить это без test миграций.

...