Gradle 为运行时依赖创建循环依赖

Gradle creates circular dependency for runtime dependency

我有一个 mutli 模块 gradle 项目:

subprojects {
    apply plugin: 'java-library'
}

project(':core') {
    dependencies {
        compile project(':module:mod-a')
    }
}

project(':module:mod-a') {
    dependencies {
        compile project(':core')
    }
}

project(':module:mod-b') {
    dependencies {
        compile project(':core')
    }
}

当然这会导致循环编译依赖:

* What went wrong:
Circular dependency between the following tasks:
:core:compileJava
+--- :core:compileJava (*)
\--- :module:mod-a:compileJava
    +--- :core:compileJava (*)
    \--- :module:mod-a:compileJava (*)

困扰我的是,即使我将 compile 依赖项从 :core 更改为 :module:mod-aruntime 依赖项,仍然无法编译项目:

* What went wrong:
Circular dependency between the following tasks:
:module:mod-a:compileJava
\--- :module:mod-a:compileJava (*)

我不明白为什么会有问题。 :core 确实只在运行时需要模块,因此可以先编译。之后可以使用内核编译模块。此外,:core 不再是来自 Gradle 的错误消息的一部分。所以 Gradle 在 "see" 看来它只是一个运行时依赖项。

问题出在哪里,如何解决?

当你

dependencies {
    runtime project(':xxx')
}

相同
dependencies {
    runtime project(path: ':xxx', configuration: 'default')
}

参见 here,其中指出 default 配置扩展了 runtime

因此,通过这样做,您使 :module:mod-a 依赖于 :core 中的 runtime 配置。因此循环依赖

您可以参考 archives 配置而不是 default 来打破循环

例如:

subprojects {
    apply plugin: 'java'
}
project(':core') {
    artifacts {
        archives jar
    }
}
project(':module:mod-a') {
    dependencies {
        compile project(path: ':core', configuration: 'archives')
        compile project(path: ':core', configuration: 'runtime')
    }
}

使用 runtimeOnly 而不是 runtime 似乎可以解决问题。