gradle包含传递运行时依赖性作为编译依赖性

时间:2016-01-28 16:06:52

标签: java gradle dependency-management

我在gradle依赖关系管理中表达了一种奇怪的行为,其中项目A将项目B引用为编译依赖项,而项目B将库C引用为运行时依赖项。现在我可以在项目A中使用库C中的类。

我的问题:(为什么)这是一个错误或功能?

可以使用gradle 2.9和2.10以及以下最小设置重现该问题:

// settings.gradle
include ':A', ':B'
// build.gradle
allprojects {
    apply plugin: 'java'
    apply plugin: 'maven'

    repositories {
        mavenLocal()
        mavenCentral()
    }
}

project(':A') {
    dependencies {
        compile project(':B')
    }
}

project(':B') {
    dependencies {
        runtime "org.slf4j:slf4j-log4j12:1.7.13"
    }
}

如您所见,gradle :A:dependencies显示

[...]

compile - Compile classpath for source set 'main'.
\--- project :B
     \--- org.slf4j:slf4j-log4j12:1.7.13
          +--- org.slf4j:slf4j-api:1.7.13
          \--- log4j:log4j:1.2.17
[...]

并且在驻留在项目A中的Java代码中完全可以使用log4j。

2 个答案:

答案 0 :(得分:6)

this Q& A。如果您未指定配置,Gradle将选择从default延伸的runtime配置。快速解决方法是使用

compile project(path: ":B", configuration: "compile")

答案 1 :(得分:0)

对于Android库(aar)传递式运行时依赖关系,此问题已从Gradle从5.0开始修复。