我目前正在使用 Gradle 构建一个项目,它依赖于我在编译时需要的第三方组件,但该组件将在运行时提供。在 Maven 中,我将按照提供的方式声明此依赖项,在 Gradle 中,我将其声明如下:
compileOnly group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.4.0.cloudera1'
Run Code Online (Sandbox Code Playgroud)
我依赖上面的火花工件这一事实与这个问题并没有真正的密切关系(我提供此信息是为了使示例更加具体。)
现在,假设我想为我的应用程序(或库,视情况而定)编写一些单元测试。使用 Gradle 时,我想出的唯一方法很笨拙:我将依赖项重新声明为 testCompile 依赖项,并且我的测试能够运行:
compileOnly group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.4.0.cloudera1'
testCompile group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.4.0.cloudera1'
Run Code Online (Sandbox Code Playgroud)
我真的不喜欢两次声明我的依赖项的重复和混乱,我想知道是否有更好的方法在 Gradle 中做到这一点?
结论
Mike 的回答让我选择了我选择的解决方案,即将其放在我的多项目构建的顶层 gradle 文件中。
subprojects {
sourceSets {
test.compileClasspath += configurations.compileOnly
test.runtimeClasspath += configurations.compileOnly
}
}
Run Code Online (Sandbox Code Playgroud) 我该如何重新表述:
testCompile.extendsFrom compileOnly
Run Code Online (Sandbox Code Playgroud)
Gradle Groovy DSL 与其基于 Kotlin 的等效项?
configurations {
testCompile{
extendsFrom(compileOnly)
}
}
Run Code Online (Sandbox Code Playgroud)
我上面的方法失败了。