Reputation: 603
I am migrating a project from Spring Boot 1.5.21 to 2.2.5. I have followed all instructions in the guide. However, I have an issue with flyway (upgrading from 4.2.0 to 6).
Previously, when I had sql migration files under src/test/resources/db/migration
, flyway would run them as part of the mvn clean install
command. Now, for some reason, it stopped running these migrations (Just to clarify, I'm talking about maven
build and not while running the app).
I'm using maven 3.6.3
and flyway-maven-plugin version 6.0.8
with the following configuration (some values are tokens which are irrelevant for this question):
<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>
Why did the behaviour changed? How to revert to old behaviour? Am I missing something?
Upvotes: 5
Views: 2373
Reputation: 1227
I have dug in the flyway
and flyway-maven-plugin
sorces. I have found that the path from classpath location tag is searched by ClassRealm
in class. And there is exist two classpathes: ClassRealm[plugin>org.flywaydb:flyway-maven-plugin:5.0.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@1f89ab83]
. ClassRealm
is a classloader that is used in Maven.
I have executed classLoader.getResources('/db/migration')
and found that it returns 2 paths (target/classes/db/migration
and target/test-classes/db/migration
) for mave-plugin version 4.2.0
, but returns only 1 path (target/classes/db/migration) for version
5.0.0`.
Also I have found that there was a commit in flyway-maven-plugin repository for using maven 3 instead of 2 between maven-plugin
version 4.2.0 and 5.0.0.
I haven't found an exact reason, but, summarizing all, I guess that there were some changes in maven-plugin (I guess some maven core library version) as a result of which the finding path in classpath was changed.
I have tried several options for returning the old behavior, but all of these not so good. These are work:
maven-plugin
version (I have a pet project where
I specified flyway 5.0.0 in <dependencies>
and use maven-plugin
4.2.0 and it works correctly for you);<location>filesystem:target/test-classes/db/migration</location>
or <location>filesystem:src/test/resources/db/migration</location>
I hope it will help you.
P.S. By the way, why do you use migration under test folder for generating classes by jooq? It looks very strange to me. You generate classes from one DB model, but in PROD you will have another DB model (since migrations only under main
are used). Maybe you should think about it and using only migration under main
folder? If you have some exceptions while jooq generatinig, try to fix it without test
migrations.
Upvotes: 2