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

Posted

技术标签:

【中文标题】Gradle :: runtime.exclude group: \'org.apache.hadoop\' 影响测试范围?【英文标题】:Gradle :: runtime.exclude group: 'org.apache.hadoop' affects test scope?Gradle :: runtime.exclude group: 'org.apache.hadoop' 影响测试范围? 【发布时间】:2017-06-02 02:39:08 【问题描述】:

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

在 gradle 作用域中,test 继承自 runtime。您的测试代码排除了 minicluster 依赖项,因为运行时排除了它。

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

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

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

gradle manual 中提供了有关 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'

【讨论】:

我最终做了类似的事情 - 添加了另一个配置参考,排除了那些 hadoop/spark 组和传递 deps,并在 shadowJar 插件执行中使用了该配置。非常感谢图表和解释!

以上是关于Gradle :: runtime.exclude group: 'org.apache.hadoop' 影响测试范围?的主要内容,如果未能解决你的问题,请参考以下文章

简单理解Gradle,Gradle是什么,一分钟入门Gradle

GroovyGradle 环境搭建 ( 下载 Gradle 工具 | 查找本地缓存的 Gradle 工具 | 配置 Gradle 环境变量 )

Android Gradle 插件Gradle 构建工具简介 ① ( Gradle 环境配置 | 官网下载 Gradle 软件包 | 在本地用户目录下查找 | 配置 Gradle 环境变量 )

Android Gradle 插件Gradle 依赖管理 ① ( org.gradle.api.Project 配置 | Android Gradle 插件配置与 Gradle 配置关联 ) ★

gradle wrapper, gradle ,gradle plugin 之间的关系

Gradle与Gradle插件