Flyway Gradle插件-循环依赖

Flyway Gradle插件-循环依赖,gradle,circular-dependency,flyway,mybatis-generator,Gradle,Circular Dependency,Flyway,Mybatis Generator,我有一个使用gradle、flyway gradle插件、mybatis生成器和postgres的项目。在我的build.gradle中,我有: compileJava.dependsOn('myBatisGenerator') 我想在myBatisGenerator运行之前运行flywayMigrate任务。因此,我做了以下工作: myBatisGenerator.dependsOn('flywayMigrate') 当我尝试使用gradle测试运行构建时,我得到以下错

我有一个使用gradle、flyway gradle插件、mybatis生成器和postgres的项目。在我的build.gradle中,我有:

  compileJava.dependsOn('myBatisGenerator')
我想在myBatisGenerator运行之前运行flywayMigrate任务。因此,我做了以下工作:

        myBatisGenerator.dependsOn('flywayMigrate')
当我尝试使用gradle测试运行构建时,我得到以下错误:

FAILURE: Build failed with an exception.

* What went wrong:
Circular dependency between the following tasks:
:classes
+--- :compileGroovy
|    \--- :compileJava
|         \--- :myBatisGenerator
|              \--- :flywayMigrate
|                   \--- :testClasses
|                        +--- :compileTestGroovy
|                        |    +--- :classes (*)
|                        |    \--- :compileTestJava
|                        |         \--- :classes (*)
|                        \--- :compileTestJava (*)
\--- :compileJava (*)

(*) - details omitted (listed previously)

我不知道为什么会从flywayMigrate插件中调用compileTestJava。有没有办法解决这个问题并在mybatis generator之前运行flyway插件?

我查看了flyway gradle插件代码(),我猜flyway任务依赖于编译任务,以便支持使用flyway Java api编写的迁移

flyway插件似乎假设,如果项目是java项目,那么您使用的是java api

从字里行间看,flyway似乎希望您的迁移有一个单独的gradle子项目

因此,将您的迁移移动到一个名为“迁移”的子项目。那你就可以了

myBatisGenerator.dependsOn(':migrations:flywayMigrate')
和“:migrations:flywayMigrate”将仅取决于“:migrations:compileTestJava”而不是您的主“:compileTestJava”(即使如此,也仅当“migrations”是java项目时)

替代解决方法:


或者,您可以使用类似于flywayMigrate.taskDependencies.values-=“testClasses”的方法删除taskDependency
project.afterEvaluate {
    flywayClean.dependsOn -= testClasses
    flywayMigrate.dependsOn = [processResources, processTestResources]
}