我有一个使用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生成器之前运行flyway插件?
答案 0 :(得分:3)
我看了一下flyway gradle插件代码(https://github.com/flyway/flyway/tree/master/flyway-gradle-plugin),我的猜测是,flyway任务依赖于编译任务,以支持使用flyway Java api编写的迁移。
flyway插件似乎假设如果项目是一个java项目,那么你正在使用Java api。
在各行之间阅读,似乎flyway希望您为迁移创建一个单独的gradle子项目。
因此,将迁移移至名为“迁移”的子项目。然后就可以了
myBatisGenerator.dependsOn(':migrations:flywayMigrate')
和':migrations:flywayMigrate'将仅依赖于':migrations:compileTestJava'而不是你的主':compileTestJava'(即使那时只有'migrations'是一个java项目)
答案 1 :(得分:2)
替代解决方法:https://github.com/flyway/flyway/issues/775
project.afterEvaluate {
flywayClean.dependsOn -= testClasses
flywayMigrate.dependsOn = [processResources, processTestResources]
}