Gradle :: runtime.exclude 组:'org.apache.hadoop' 影响测试范围?

Gradle :: runtime.exclude group: 'org.apache.hadoop' affects test scope?

我的 build.gradle 中有以下内容:

configurations {
  runtime.exclude group: 'org.apache.spark'
  runtime.exclude group: 'org.apache.hadoop'
}

出于某种原因,这也从测试类路径中排除了所有 Hadoop/Spark 代码。如果我注释掉这个配置 - 测试顺利通过,否则我会遇到各种 java.lang.NoClassDefFoundError: org/apache/hadoop/hdfs/MiniDFSCluster$Builder 问题。

我试过用这个:

test {
  classpath += configurations.compile

}

运气不好。

我在这里错过了什么?

在 gradle 范围内,test 继承自 runtime。您的测试代码排除了 minicluster 依赖项,因为运行时将其排除在外。

请参阅此图了解 java 插件的范围继承树:

您可能不想将全局排除项添加到运行时配置中,而是希望将 spark 依赖项设置为 compileOnly 范围内的依赖项,自 gradle 2.12 起可用。

configurations {
  compileOnly 'org.apache.spark:spark:2.11'
  test 'org.apache.hadoop:hadoop-minicluster:2.7.2'
}  

有关 gradle 范围的更多信息可在 gradle manual:

或者,您可以添加另一个从运行时继承的配置,并向其添加排除项,然后将其用作 shadowJar 的基础。如果您想选择性地构建一个包含或不包含 spark 依赖项的 jar,这可能会有所帮助。您的测试将使用没有排除项的配置,但您打包的 jar 将不包含 spark 依赖项。

configurations {
    sparkConfiguration {
        extendsFrom runtime
        exclude group: 'org.apache.hadoop'
        exclude group: 'org.apache.spark'
    }
}

task sparkExcludedJar(type: ShadowJar) {
    group = "Shadow"
    configurations = [project.configurations.sparkConfiguration]
    classifier = 'sparkExcluded'
}