代码之家  ›  专栏  ›  技术社区  ›  Richard

Flyway Java回调

  •  2
  • Richard  · 技术社区  · 6 年前

    我有一个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>
    

    但我还是犯了同样的错误。如何让它运行而不出现问题?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Gabriele Coletta    6 年前

    第一:flyway。回调属性必须以包名称开头,因此

    "callbacks.VersionNumberToTimestampFlywayCallback" 
    

    "callbacks.FooCallback"
    

    没有“main.java”前缀。

    第二:flyway maven插件使用目标目录中的编译类。尝试运行目标:

    clean compile flyway:migrate
    
        2
  •  0
  •   SuniiilSingh    5 年前

    使用flyway的bellow依赖,可以解决此问题。

        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
            <version>5.2.3</version>
        </dependency>