apache-spark - 使用 Gradle 构建 Spark fat jar : shadow plugin yields corrupted JAR file

标签 apache-spark gradle apache-spark-sql gradle-shadow-plugin

我正在尝试使用 Gradle 构建 Spark fat jar。构建成功,但文件以一种微妙的方式损坏:尝试运行它会产生:

Error: Could not find or load main class shadow_test.Main
Caused by: java.lang.ClassNotFoundException: shadow_test.Main

JAR 本身看起来不错:缺少的类就在那里,当我解压缩它时,我可以正常运行该项目。

这是gradle.build文件:

plugins {
    id "scala"
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

ext {
    ver = [
            scala   : '2.11.12',
            scala_rt: '2.11',
            spark   : '2.4.4'
    ]
}

configurations {
    // Dependencies that will be provided at runtime in the cloud execution
    provided

    compileOnly.extendsFrom(provided)
    testImplementation.extendsFrom provided
}

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.scala-lang:scala-library:$ver.scala"

    provided "org.apache.xbean:xbean-asm6-shaded:4.10"
    provided "org.apache.spark:spark-sql_$ver.scala_rt:$ver.spark"
    provided "org.apache.spark:spark-hive_$ver.scala_rt:$ver.spark"

    testImplementation "org.testng:testng:6.14.3"
}

tasks.register("allJar", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
    manifest {
        attributes "Main-Class": "shadow_test.Main"
    }

    from sourceSets.main.output
    configurations = [project.configurations.runtimeClasspath, project.configurations.provided]

    zip64 true

    mergeServiceFiles()

    with jar
}

test {
    useTestNG()
}


Gradle 版本为 7.3.3

重现此问题的最小项目的完整代码可以在 https://github.com/SashaOv/shadow-jar-repro 找到。

感谢您的任何线索

最佳答案

该问题已由 Gradle 社区解决:https://discuss.gradle.org/t/possible-to-build-spark-fat-jar-with-gradle/42235/2?u=sashao

我缺少签名文件的排除:

exclude 'META-INF/*.DSA'
exclude 'META-INF/*.SF'

关于apache-spark - 使用 Gradle 构建 Spark fat jar : shadow plugin yields corrupted JAR file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71098364/

相关文章:

java - Java 中 Spark Dataframe 的直方图

scala - 将 Scala 案例类传输到 rdd.map func 中的 JsValue 但任务不可序列化

python - pyspark 中的命名累加器

apache-spark - 如何将 LIBSVM 模型(使用 LIBSVM 保存)读入 PySpark?

webdriver - 如何使第二个浏览器在Selenium2 Grid Hub上运行

Gradletasks.build.doLast() 没有被调用

python - PySpark - 添加一个按用户排名的新列

python - Spark Streaming - 滑动窗口和不同的使用

java - gradle如何定义jar文件的依赖jar文件?

java - 在 Spark SQL 中对具有任意行的数据集使用映射