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

时间:2017-01-17 21:20:15

标签: gradle shadowjar

我在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

}

没有运气。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

在gradle范围界定中,test继承自runtime。您的测试代码不包括minicluster依赖项,因为运行时将其排除。

请参阅此图以获取java插件的范围继承树: gradle configuration inheritance

除了将全局排除添加到运行时配置之外,您可能希望将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'
}