【问题标题】: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

}

运气不好。

我在这里错过了什么?

【问题讨论】:

    标签: gradle shadowjar


    【解决方案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 插件执行中使用了该配置。非常感谢图表和解释!
    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    相关资源
    最近更新 更多