Flyway Java 回调
Flyway Java Callbacks
我有一个 maven-flyway 项目,其中充满了 sql 到 运行 的脚本。这是我的项目目录结构:
src/
├── main/
└── java/
└── callbacks/
├── FooCallback.java
└── resources/
└── db/
├── Script1.sql
├── Script2.sql
├── Script3.sql
└── ...
这是我 pom.xml
中的属性:
<properties>
<java.version>1.8</java.version>
<maven.flyway.version>5.0.6</maven.flyway.version>
<flyway.callbacks>main.java.callbacks.FooCallbback</flyway.callbacks>
<flyway.outOfOrder>true</flyway.outOfOrder>
<url>...</url>
<user>...</user>
<password>...</password>
<locations>db</locations>
</properties>
但每次我 运行 flyway:migrate
我都会收到以下错误:
[ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:4.0.3:migrate (default-cli) on project database: org.flywaydb.core.api.FlywayException: Unable to instantiate class: main.java.callbacks.FooCallback -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.flywaydb:flyway-maven-plugin:4.0.3:migrate (default-cli) on project database: org.flywaydb.core.api.FlywayException: Unable to instantiate class: main.java.callbacks.FooCallback
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
Caused by: org.apache.maven.plugin.MojoExecutionException: org.flywaydb.core.api.FlywayException: Unable to instantiate class: main.java.callbacks.FooCallback
at org.flywaydb.maven.AbstractFlywayMojo.execute(AbstractFlywayMojo.java:541)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
... 21 more
Caused by: java.lang.ClassNotFoundException: main.java.callbacks.FooCallback
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.flywaydb.core.internal.util.ClassUtils.instantiate(ClassUtils.java:49)
at org.flywaydb.core.internal.util.ClassUtils.instantiateAll(ClassUtils.java:65)
at org.flywaydb.core.Flyway.setCallbacksAsClassNames(Flyway.java:867)
at org.flywaydb.core.Flyway.configure(Flyway.java:1263)
at org.flywaydb.maven.AbstractFlywayMojo.execute(AbstractFlywayMojo.java:537)
... 23 more
显然我的文件夹结构有些混乱。我已尝试将我的文件夹结构更改为:
src/
├── main/
└── resources/
└── db/
└── callbacks/
├── FooCallback.java
├── Script1.sql
├── Script2.sql
├── Script3.sql
└── ...
我的 pom 属性为:
<flyway.callbacks>db.callbacks.FooCallback</flyway.callbacks>
但我仍然得到同样的错误。我如何才能毫无问题地将其发送到 运行?
首先:flyway.callbacks 属性 必须以包名开头,所以
"callbacks.VersionNumberToTimestampFlywayCallback"
或
"callbacks.FooCallback"
没有 "main.java" 前缀。
其二:flyway-maven-plugin在target目录下使用编译好的类。尝试 运行 个目标:
clean compile flyway:migrate
使用下面的flyway依赖,会解决这个问题。
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.3</version>
</dependency>
我有一个 maven-flyway 项目,其中充满了 sql 到 运行 的脚本。这是我的项目目录结构:
src/
├── main/
└── java/
└── callbacks/
├── FooCallback.java
└── resources/
└── db/
├── Script1.sql
├── Script2.sql
├── Script3.sql
└── ...
这是我 pom.xml
中的属性:
<properties>
<java.version>1.8</java.version>
<maven.flyway.version>5.0.6</maven.flyway.version>
<flyway.callbacks>main.java.callbacks.FooCallbback</flyway.callbacks>
<flyway.outOfOrder>true</flyway.outOfOrder>
<url>...</url>
<user>...</user>
<password>...</password>
<locations>db</locations>
</properties>
但每次我 运行 flyway:migrate
我都会收到以下错误:
[ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:4.0.3:migrate (default-cli) on project database: org.flywaydb.core.api.FlywayException: Unable to instantiate class: main.java.callbacks.FooCallback -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.flywaydb:flyway-maven-plugin:4.0.3:migrate (default-cli) on project database: org.flywaydb.core.api.FlywayException: Unable to instantiate class: main.java.callbacks.FooCallback
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
Caused by: org.apache.maven.plugin.MojoExecutionException: org.flywaydb.core.api.FlywayException: Unable to instantiate class: main.java.callbacks.FooCallback
at org.flywaydb.maven.AbstractFlywayMojo.execute(AbstractFlywayMojo.java:541)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
... 21 more
Caused by: java.lang.ClassNotFoundException: main.java.callbacks.FooCallback
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.flywaydb.core.internal.util.ClassUtils.instantiate(ClassUtils.java:49)
at org.flywaydb.core.internal.util.ClassUtils.instantiateAll(ClassUtils.java:65)
at org.flywaydb.core.Flyway.setCallbacksAsClassNames(Flyway.java:867)
at org.flywaydb.core.Flyway.configure(Flyway.java:1263)
at org.flywaydb.maven.AbstractFlywayMojo.execute(AbstractFlywayMojo.java:537)
... 23 more
显然我的文件夹结构有些混乱。我已尝试将我的文件夹结构更改为:
src/
├── main/
└── resources/
└── db/
└── callbacks/
├── FooCallback.java
├── Script1.sql
├── Script2.sql
├── Script3.sql
└── ...
我的 pom 属性为:
<flyway.callbacks>db.callbacks.FooCallback</flyway.callbacks>
但我仍然得到同样的错误。我如何才能毫无问题地将其发送到 运行?
首先:flyway.callbacks 属性 必须以包名开头,所以
"callbacks.VersionNumberToTimestampFlywayCallback"
或
"callbacks.FooCallback"
没有 "main.java" 前缀。
其二:flyway-maven-plugin在target目录下使用编译好的类。尝试 运行 个目标:
clean compile flyway:migrate
使用下面的flyway依赖,会解决这个问题。
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.3</version>
</dependency>