【问题标题】:Gradle creates circular dependency for runtime dependencyGradle 为运行时依赖创建循环依赖
【发布时间】:2018-02-16 12:23:28
【问题描述】:

我有一个多模块 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 似乎“看到”了它只是一个运行时依赖。

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

【问题讨论】:

    标签: gradle compilation dependencies runtime circular-dependency


    【解决方案1】:

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

    【讨论】:

    • 我在使用 gradle 时遇到了同样的问题,但添加 runtimeOnly 也无济于事
    • 解决了这个问题。我实际上使用的是spring-boot-plugin,默认情况下会禁用正常的jar创建任务并默认构建bootJar。 bootJar 需要拥有所有运行时和编译时依赖项,因此它也试图构建运行时依赖项,因此出现了循环依赖问题。我通过在 build.gradle 文件中添加 'jar{enabled = true}' 禁用了默认 bootJar,构建成功。
    【解决方案2】:

    当你这样做时

    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 似乎运行良好。但是在您的链接中,它甚至似乎都不存在。 runtimeOnly 是什么?
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多