flyway 是否支持 sql 测试文件夹下的迁移?

Does flyway support sql migrations under test folder?

我正在将项目从 Spring Boot 1.5.21 迁移到 2.2.5。我已遵循 guide 中的所有说明。但是,我遇到了 flyway 问题(从 4.2.0 升级到 6)。

以前,当我在 src/test/resources/db/migration 下有 sql 个迁移文件时,flyway 会将它们 运行 作为 mvn clean install 命令的一部分。现在,出于某种原因,它停止了 运行ning 这些迁移(澄清一下,我说的是 maven 构建而不是 运行ning 应用程序)。

我正在使用具有以下配置的 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>

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

我在 flywayflyway-maven-plugin 中进行了挖掘。我发现 classpath location 标签的路径被 ClassRealm 在 class 中搜索。并且存在两个 class 路径:ClassRealm[plugin>org.flywaydb:flyway-maven-plugin:5.0.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@1f89ab83]ClassRealm 是 Maven 中使用的 classloader。

我已经执行了 classLoader.getResources('/db/migration'),发现它 returns 2 条路径(target/classes/db/migrationtarget/test-classes/db/migration)用于 mave-plugin 版本 4.2.0,但是 returns 只有 1 条路径 (target/classes/db/migration) for version5.0.0`.

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

我还没有找到确切的原因,但是,总而言之,我猜想 maven-plugin 中有一些变化(我猜是一些 maven 核心库版本)因此 class路径已更改。

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

  1. 留在 4.2.0 maven-plugin 版本(我有一个宠物项目 我在 <dependencies> 中指定了 flyway 5.0.0 并使用 maven-plugin 4.2.0,它对你来说工作正常);
  2. 通过 <location>filesystem:target/test-classes/db/migration</location><location>filesystem:src/test/resources/db/migration</location>
  3. 指定测试迁移路径

希望对你有所帮助

P.S。顺便说一下,为什么你使用测试文件夹下的迁移来生成classes by jooq?我觉得很奇怪。您从一个数据库模型生成 classes,但在 PROD 中您将拥有另一个数据库模型(因为仅使用 main 下的迁移)。也许你应该考虑一下,只使用 main 文件夹下的迁移?如果你在生成 jooq 时有一些异常,请尝试在没有 test 迁移的情况下修复它。