Gradle循环依赖排查:无明显依赖循环却报错求解
问题
我有三个Gradle模块:
main-data:无内部项目依赖vendor-data:依赖:app-main-datainvoice-data:同时依赖:app-main-data和:app-modules:vendors:data
构建时出现compileJava与compileKotlin任务的循环依赖错误,但移除vendor-data依赖后构建正常,需要排查问题原因。
相关配置
main-data的build.gradle
dependencies { implementation("org.postgresql:postgresql:${Versions.postgresVersion}") implementation("com.zaxxer:HikariCP:${Versions.hikariVersion}") } // To run: ./gradlew flywayMigrate flyway { url = "jdbc:postgresql://localhost:5432/app" user = "app" password = "app" validateOnMigrate = false }
vendor-data的build.gradle
dependencies { implementation(project(":app-main-data")) }
invoice-data的build.gradle
dependencies { implementation(project(":app-main-data")) implementation(project(":app-modules:vendors:data")) }
settings.gradle配置
include( ":app-main", ":app-main-data", ) include( ":app-modules:vendors:data", ) include( ":app-modules:invoices:api", ":app-modules:invoices:data", )
报错信息
FAILURE: Build failed with an exception. * What went wrong: Circular dependency between the following tasks: :app-modules:invoices:data:compileJava +--- :app-modules:invoices:data:compileJava (*) \--- :app-modules:invoices:data:compileKotlin +--- :app-modules:invoices:data:compileJava (*) \--- :app-modules:invoices:data:compileKotlin (*) (*) - details omitted (listed previously)
排查与解决方案
报错显示循环依赖发生在invoice-data模块自身的compileJava和compileKotlin任务之间,而非跨模块依赖循环。移除vendor-data依赖后构建正常,说明问题与该依赖引入的配置或插件关联,具体排查方向及解决办法如下:
Kotlin与Java插件的任务冲突
- 检查
invoice-data和vendor-data模块是否同时应用java和kotlin插件,且插件版本不一致。Gradle中同时使用这两个插件时,配置不当会导致编译任务互相依赖。 - 解决:所有模块统一使用相同版本的Kotlin插件;优先应用
kotlin("jvm")插件,再应用java插件,或直接用kotlin("jvm")替代单独的java插件。
- 检查
Flyway插件的传递性配置问题
main-data配置了Flyway插件,若该插件通过依赖传递被误应用到invoice-data模块,可能干扰编译任务的依赖链,触发循环。- 解决:将Flyway插件的应用范围限制在
main-data模块,避免传递给其他模块。修改main-data的build.gradle:plugins { id 'java' id 'org.flywaydb.flyway' apply false } apply plugin: 'org.flywaydb.flyway'
模块路径引用不一致
- 检查
settings.gradle中模块路径与依赖引用的一致性,注意大小写(Linux/macOS下路径大小写敏感),避免拼写错误。 - 解决:统一使用
settings.gradle中定义的完整模块路径引用依赖。
- 检查
自定义编译任务的依赖错误
- 排查是否存在自定义Gradle任务或配置修改了
compileJava/compileKotlin的依赖关系,导致任务互相依赖。 - 解决:移除或修正自定义配置,确保
compileKotlin仅依赖上游前置任务,而非与compileJava形成循环。
- 排查是否存在自定义Gradle任务或配置修改了
内容的提问来源于stack exchange,提问作者Whizzil
相关产品推荐
相关产品推荐

