You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SBT Assembly JAR执行spark-submit时主类找不到(ClassNotFoundException)

解决Spark Submit找不到主类sparkpoc.KinesisExample的问题

我之前也踩过类似的坑,结合你的情况,咱们一步步排查解决:

1. 先确认主类是否真的被打包进Assembly JAR

这是最关键的第一步,用命令查看JAR包内容:

jar tf ~/git/ming-spark-poc/target/scala-2.11/ming-spark-poc-assembly-0.1.jar | grep sparkpoc/KinesisExample

如果没有任何输出,说明主类根本没被打包进去,问题出在编译或SBT配置环节;如果能看到sparkpoc/KinesisExample.class,那再往下排查。

2. 检查代码目录结构与包名是否匹配

Scala对源码目录结构有严格要求:

  • 你的代码包是sparkpoc,那么KinesisExample.scala必须放在src/main/scala/sparkpoc/目录下,而不是直接放在src/main/scala/根目录。如果目录结构不对,SBT编译时不会把类放到正确的包路径下,自然找不到。

3. 确认代码能正常编译

先运行sbt compile,然后查看编译后的class文件是否存在:

ls target/scala-2.11/classes/sparkpoc/

如果看不到KinesisExample.class,说明代码有编译错误——比如你贴的代码里impo...明显是截断的import语句,这会导致编译失败,自然不会生成class文件。先把代码补全,确保能正常编译通过。

4. 尝试用SBT直接运行主类,验证代码有效性

在项目目录下执行:

sbt "runMain sparkpoc.KinesisExample"

如果这个命令能正常运行,说明代码和编译环境没问题,问题就出在Assembly打包环节;如果运行失败,先解决编译或依赖问题。

5. 调整SBT Assembly配置

你的assemblyMergeStrategy设置得比较激进,尝试先恢复默认的合并策略,再打包试试:

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) =>
    xs match {
      case ("MANIFEST.MF" | "INDEX.LIST" | "DEPENDENCIES") :: _ => MergeStrategy.discard
      case _ => MergeStrategy.first
    }
  case _ => MergeStrategy.first
}

另外,确保assembly.sbt放在project/目录下(不是项目根目录),SBT才能加载到这个插件。

6. 简化spark-submit命令试试

去掉类名的引号,有时候引号可能会导致解析问题:

./bin/spark-submit --class sparkpoc.KinesisExample --master local[4] ~/git/ming-spark-poc/target/scala-2.11/ming-spark-poc-assembly-0.1.jar

内容的提问来源于stack exchange,提问作者Ming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:47:00