I’ve just added flyway to my Spring Boot 3.2 project.
It runs well except with maven plugin.
When I run mvn flyway:info -P dev
, it gives me
Exception in thread "main" java.util.ServiceConfigurationError: org.flywaydb.core.extensibility.Plugin: org.flywaydb.core.internal.reports.json.InfoResultDeserializer Unable to get public no-arg constructor
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:582)
at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:675)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1236)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1269)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1305)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1387)
at org.flywaydb.core.internal.plugin.PluginRegister.registerPlugins(PluginRegister.java:44)
at org.flywaydb.core.internal.plugin.PluginRegister.getPlugins(PluginRegister.java:58)
at org.flywaydb.core.internal.plugin.PluginRegister.getPlugins(PluginRegister.java:64)
at org.flywaydb.core.internal.configuration.ConfigUtils.convertKey(ConfigUtils.java:365)
at org.flywaydb.core.internal.configuration.ConfigUtils.environmentVariablesToPropertyMap(ConfigUtils.java:130)
at org.flywaydb.maven.AbstractFlywayMojo.execute(AbstractFlywayMojo.java:848)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000(MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run(MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute(DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:903)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:280)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:203)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:314)
Caused by: java.lang.VerifyError: Bad return type
Exception Details:
Location:
org/flywaydb/core/internal/reports/json/InfoResultDeserializer.deserialize(Lcom/google/gson/JsonObject;)Lorg/flywaydb/core/api/output/HtmlResult; @5: areturn
Reason:
Type 'org/flywaydb/core/api/output/InfoResult' (current frame, stack[0]) is not assignable to 'org/flywaydb/core/api/output/HtmlResult' (from method signature)
Current Frame:
bci: @5
flags: { }
locals: { 'org/flywaydb/core/internal/reports/json/InfoResultDeserializer', 'com/google/gson/JsonObject' }
stack: { 'org/flywaydb/core/api/output/InfoResult' }
Bytecode:
0000000: 2a2b b600 35b0
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3572)
at java.base/java.lang.Class.getConstructor0(Class.java:3777)
at java.base/java.lang.Class.getConstructor(Class.java:2452)
at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:662)
at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:659)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:670)
... 35 more
Found nothing about this anywhere.
As SpringBoot 3.2 is linked to Flyway 9.22, I’ve also tried to manually upgrade flyway to V10. It gives the same.
Here are my pom.xml
elements:
- Dependencies:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.0.0</version>
<scope>runtime</scope>
</dependency>
- Plugin settings
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>8.5.13</version>
<configuration>
<url>${db.url}</url>
<user>${db.username}</user>
<password>${db.password}</password>
</configuration>
</plugin>
- Properties
<profile>
<id>dev</id>
<properties>
<!-- For flyway: maven plugin -->
<db.username>my-user</db.username>
<db.password>xxxxxx</db.password>
<db.url>jdbc:mysql://localhost:3306/mydb</db.url>
<!-- Add dev_data to the flyway locations for test purpose -->
<flyway.locations>classpath:db/migration,db/dev_data</flyway.locations>
</properties>
</profile>