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

时间:2018-02-16 12:23:28

标签: gradle compilation dependencies runtime circular-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依赖项,仍然无法编译项目:< / p>

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

我不明白为什么会出现问题。 :core仅在运行时需要该模块,因此可以先编译。之后,可以使用核心编译模块。此外,:core不再是Gradle错误消息的一部分。所以Gradle似乎“看到”它只是一个运行时依赖。

问题在哪里以及如何解决?

2 个答案:

答案 0 :(得分:0)

当你这样做时

dependencies {
    runtime project(':xxx')
}

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

请参阅here,其中指出default配置扩展runtime

通过这样做,您:module:mod-a取决于runtime中的:core配置。因此,曲解的依赖

您可以引用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')
    }
}

答案 1 :(得分:0)

使用runtimeOnly代替runtime似乎可以解决问题。