1

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

}

没运气。

我在这里想念什么?

4

1 回答 1

2

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

有关 java 插件的范围继承树,请参见此图: gradle 配置继承

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

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

有关 gradle 作用域的更多信息,请参阅gradle 手册

或者,您可以添加另一个从运行时继承的配置,并向其中添加排除项,然后将其用作 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'
}
于 2017-01-17T22:43:27.980 回答