我正在将一个项目从Spring Boot 1.5.21迁移到2.2.5。我已按照guide中的所有说明进行操作。但是,我的飞行通道有问题(从4.2.0升级到6)。
[以前,当我在src/test/resources/db/migration
下有sql迁移文件时,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
源。我发现从类路径位置标记的路径由类中的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版本target/classes/db/migration
返回2条路径(target/test-classes/db/migration
和4.2.0
,但仅返回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核心库版本)发生了一些变化,结果是classpath中的查找路径发生了变化。] >
我已经尝试了几种方法来恢复旧的行为,但是所有这些都不是很好。这些是工作:
maven-plugin
版本(我有一个宠物项目,我在<dependencies>
中指定了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。顺便说一句,为什么要在jooq下使用test文件夹下的迁移来生成类?对我来说看起来很奇怪。您可以从一种数据库模型生成类,但是在PROD中,您将拥有另一种数据库模型(因为仅使用main
下的迁移)。也许您应该考虑一下,仅使用main
文件夹下的迁移?如果在jooq生成时有一些例外,请尝试在不进行test
迁移的情况下进行修复。