【问题标题】:Does flyway support sql migrations under test folder?flyway是否支持test文件夹下的sql迁移?
【发布时间】:2020-07-19 18:42:33
【问题描述】:

我正在将一个项目从 Spring Boot 1.5.21 迁移到 2.2.5。我已按照guide 中的所有说明进行操作。但是,我遇到了 flyway 问题(从 4.2.0 升级到 6)。

以前,当我在src/test/resources/db/migration 下有 sql 迁移文件时,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>

为什么行为会改变?如何恢复旧行为?我错过了什么吗?

【问题讨论】:

  • 您是否尝试使用调试日志运行 maven 构建?
  • 一条评论,与您的问题无关。请注意,flyway 4 中的迁移日志放在 schema_versions 表中,但在 flyway 6 中 - 在 flyway_schema_history 中。请注意何时更新您的 PROD 代码。你可以在这里阅读它stackoverflow.com/questions/49063385/…
  • @MaximPopov - 我已经使用调试日志运行了 maven 构建,并比较了我的更改前后,但找不到原因。另外,我知道元数据表名称的变化,我正在处理它(通过 flyway 回调重命名我的旧表),但正如你所指出的,它是不相关的,因为即使在新环境中也会发生问题。跨度>
  • 我的理解是正确的,maven 构建只是停止并且什么都不做吗?可以分享一下之前的日志吗?
  • @MaximPopov Maven 失败,因为我使用 Jooq 从 DB 表生成类,但我需要从中生成类的表是应该在停止运行的 sql 迁移中创建的表,所以错误日志中是问题的结果,而不是飞行路径行为变化的原因

标签: spring-boot maven-3 flyway spring-boot-maven-plugin


【解决方案1】:

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

我执行了classLoader.getResources('/db/migration'),发现它为mave-plugin版本4.2.0返回2个路径(target/classes/db/migrationtarget/test-classes/db/migration),但只返回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核心库版本)发生了一些变化,导致类路径中的查找路径发生了变化。

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

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

希望对你有帮助。

附:顺便问一下,jooq为什么要使用test文件夹下的迁移来生成类?我觉得这很奇怪。您从一个 DB 模型生成类,但在 PROD 中您将拥有另一个 DB 模型(因为仅使用 main 下的迁移)。也许您应该考虑一下并仅在main 文件夹下使用迁移?如果您在 jooq 生成时遇到一些异常,请尝试在没有 test 迁移的情况下修复它。

【讨论】:

  • 感谢您的调查!你比我更深入地编写代码,我很感激。正如我在之前对该问题的评论中所写的那样,我选择了选项 3 并使用 classpath:db/test/migration 作为附加位置并且它有效。关于您的问题 - 从 test 文件夹生成的类仅用于集成测试目的,它仅用于 maven 编译(因此将位置添加到 pom.xml)和在本地运行测试时(将位置添加到 application-test.yml),但它们不是代码实际逻辑的一部分。
猜你喜欢
  • 2021-08-23
  • 1970-01-01
  • 2012-07-16
  • 2014-05-14
  • 2020-08-18
  • 2011-04-24
  • 2015-10-07
  • 2022-08-03
  • 2013-10-13
相关资源
最近更新 更多