首页 > 解决方案 > flyway 是否支持 test 文件夹下的 sql 迁移?

问题描述

我正在将一个项目从 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.3flyway-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>

为什么行为发生了变化?如何恢复旧行为?我错过了什么吗?

标签: spring-bootmaven-3flywayspring-boot-maven-plugin

解决方案


我已经挖掘了flywayflyway-maven-pluginsorces。我发现类路径位置标记的路径是ClassRealm在类中搜索的。并且存在两个类路径:ClassRealm[plugin>org.flywaydb:flyway-maven-plugin:5.0.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@1f89ab83]. ClassRealm是一个在 Maven 中使用的类加载器。

我已经执行classLoader.getResources('/db/migration')并发现它为mave-plugin版本返回2个路径(target/classes/db/migration和) ,但只返回1个路径(5.0.0`。target/test-classes/db/migration4.2.0target/classes/db/migration) for version

此外,我发现 flyway-maven-plugin 存储库中有一个提交,用于在maven-plugin版本 4.2.0 和 5.0.0 之间使用 maven 3 而不是 2。

我还没有找到确切的原因,但是,总而言之,我猜maven-plugin(我猜是一些maven核心库版本)发生了一些变化,因此类路径中的查找路径发生了变化。

我已经尝试了几种返回旧行为的选项,但所有这些都不是那么好。这些是工作:

  1. 继续使用 4.2.0maven-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 为什么要使用 test 文件夹下的迁移来生成类?我觉得这很奇怪。您从一个 DB 模型生成类,但在 PROD 中您将拥有另一个 DB 模型(因为仅main使用了以下迁移)。也许您应该考虑一下并仅在main文件夹下使用迁移?如果您在 jooq 生成时遇到一些异常,请尝试在不test迁移的情况下修复它。


推荐阅读