spring-boot - 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.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>
为什么行为发生了变化?如何恢复旧行为?我错过了什么吗?
解决方案
我已经挖掘了flyway
和flyway-maven-plugin
sorces。我发现类路径位置标记的路径是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/migration
4.2.0
target/classes/db/migration) for version
此外,我发现 flyway-maven-plugin 存储库中有一个提交,用于在maven-plugin
版本 4.2.0 和 5.0.0 之间使用 maven 3 而不是 2。
我还没有找到确切的原因,但是,总而言之,我猜maven-plugin(我猜是一些maven核心库版本)发生了一些变化,因此类路径中的查找路径发生了变化。
我已经尝试了几种返回旧行为的选项,但所有这些都不是那么好。这些是工作:
- 继续使用 4.2.0
maven-plugin
版本(我有一个宠物项目,我在其中指定了 flyway 5.0.0<dependencies>
并使用maven-plugin
4.2.0,它对你来说可以正常工作); <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
迁移的情况下修复它。
推荐阅读
- qt - 在 QT 中尝试使用 UDP 从特定 IP 地址接收数据
- spring-boot - 如何在 sprintboot stratup 上为反应式 r2dbc 驱动程序运行 flyway 迁移
- sql - 我想根据 SQL 中新创建的列进行过滤
- c# - 图像在 Html.BeginForm 中为空?
- django - 我无法解决 'set' 对象在 django rest 框架中不可下标
- c - 在C中将一个字符串插入另一个字符串
- php - Woocommerce 登录注册功能使用语言 url
- rest - 将 DialogFlow Rest API 与 API KEY 一起使用
- python - 如何查看使用 pynput python 3.7 按下的字符?
- vue.js - 如何在 vue 的组件中链接图像?