使用Kotlin和Apache Spark 2.3的Fat JAR

时间:2018-04-27 01:32:37

标签: apache-spark gradle jar kotlin

我正在使用gradle来构建混合Kotlin和Apache Spark的项目,但是一旦声明了spark依赖项,我生成的Fat JAR就会无效。否则它会起作用。源代码甚至不从Spark

导入任何东西
buildscript {
    ext.kotlin_version = '1.2.40'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    // uncomment this line to get main class 'myownpkg.SparkApplicationKt' 
    // not found error
    // compile 'org.apache.spark:spark-core_2.11:2.3.0'
}

jar {
    manifest { attributes 'Main-Class': 'myownpkg.SparkApplicationKt' }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

2 个答案:

答案 0 :(得分:0)

主要原因是因为您没有创建具有必要依赖关系的“FatJar”工件。配置中的编译目录只包含已编译的源代码。

maven central开始,至少需要50个编译依赖项,即spark-core需要的。您考虑过使用shadow plugin吗?

在gradle讨论中查看this thread

答案 1 :(得分:0)

经过一些实验,我意识到生成的JAR存在大量重复文件,导致运行时无法找到所需的.class。 它是在启用Spark后触发的,因为它是依赖性导致其他依赖项的雪球在META-INF文件夹下具有相同的文件路径

exclude 'META-INF/*'

这一行诀窍避免了重复,但仍然会在最终的JAR中有一个META-INF文件夹