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-a
到 runtime
依赖项,仍然无法编译项目:
* 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
似乎可以解决问题。
我有一个 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-a
到 runtime
依赖项,仍然无法编译项目:
* 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
似乎可以解决问题。