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.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
中进行了挖掘。我发现 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/migration
和 target/test-classes/db/migration
)用于 mave-plugin 版本 4.2.0
,但是 returns 只有 1 条路径 (target/classes/db/migration) for version
5.0.0`.
我还发现 flyway-maven-plugin 存储库中有一个提交,用于在 maven-plugin
版本 4.2.0 和 5.0.0 之间使用 maven 3 而不是 2。
我还没有找到确切的原因,但是,总而言之,我猜想 maven-plugin 中有一些变化(我猜是一些 maven 核心库版本)因此 class路径已更改。
我已经尝试了几种返回旧行为的选项,但所有这些都不太好。这些是工作:
- 留在 4.2.0
maven-plugin
版本(我有一个宠物项目
我在 <dependencies>
中指定了 flyway 5.0.0 并使用 maven-plugin
4.2.0,它对你来说工作正常);
- 通过
<location>filesystem:target/test-classes/db/migration</location>
或 <location>filesystem:src/test/resources/db/migration</location>
指定测试迁移路径
希望对你有所帮助
P.S。顺便说一下,为什么你使用测试文件夹下的迁移来生成classes by jooq?我觉得很奇怪。您从一个数据库模型生成 classes,但在 PROD 中您将拥有另一个数据库模型(因为仅使用 main
下的迁移)。也许你应该考虑一下,只使用 main
文件夹下的迁移?如果你在生成 jooq 时有一些异常,请尝试在没有 test
迁移的情况下修复它。
我正在将项目从 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.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
中进行了挖掘。我发现 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/migration
和 target/test-classes/db/migration
)用于 mave-plugin 版本 4.2.0
,但是 returns 只有 1 条路径 (target/classes/db/migration) for version
5.0.0`.
我还发现 flyway-maven-plugin 存储库中有一个提交,用于在 maven-plugin
版本 4.2.0 和 5.0.0 之间使用 maven 3 而不是 2。
我还没有找到确切的原因,但是,总而言之,我猜想 maven-plugin 中有一些变化(我猜是一些 maven 核心库版本)因此 class路径已更改。
我已经尝试了几种返回旧行为的选项,但所有这些都不太好。这些是工作:
- 留在 4.2.0
maven-plugin
版本(我有一个宠物项目 我在<dependencies>
中指定了 flyway 5.0.0 并使用maven-plugin
4.2.0,它对你来说工作正常); - 通过
<location>filesystem:target/test-classes/db/migration</location>
或<location>filesystem:src/test/resources/db/migration</location>
指定测试迁移路径
希望对你有所帮助
P.S。顺便说一下,为什么你使用测试文件夹下的迁移来生成classes by jooq?我觉得很奇怪。您从一个数据库模型生成 classes,但在 PROD 中您将拥有另一个数据库模型(因为仅使用 main
下的迁移)。也许你应该考虑一下,只使用 main
文件夹下的迁移?如果你在生成 jooq 时有一些异常,请尝试在没有 test
迁移的情况下修复它。