我正在使用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) } }
}
答案 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文件夹