Scala项目IntelliJ构建JAR运行提示找不到主类问题求助
问题根因
你的JAR构建配置存在两个直接导致报错的错误:
- 你手动修改了Manifest文件的输出路径到resources目录,违反了JVM对可执行JAR的规范要求:JVM只会读取JAR包内
META-INF/MANIFEST.MF路径下的Manifest配置,你放到resources目录的Manifest文件打包后不在指定路径,等于Main-Class配置完全没生效。 - 手动填写Main-Class+未确认class文件打包路径:Scala的单例object编译后会生成
superSimpleTest.class和superSimpleTest$.class两个文件,手动写Main-Class很容易出现识别偏差;同时你修改Manifest路径的操作大概率也导致构建时没有把编译生成的class文件放到JAR的正确路径下,JVM根本找不到对应的类。
修复步骤
- 先删除你之前放到resources目录下的MANIFEST.MF文件,避免旧文件引发打包冲突。
- 重新配置IntelliJ的JAR构建规则:
- 进入File -> Project Structure -> Artifacts,删除之前创建的错误JAR配置,点击
+-> JAR -> From modules with dependencies - 弹出配置窗口后:
- 选择测试代码所在的对应Module
- 点击Main Class右侧的浏览按钮,在类列表中直接选中
superSimpleTest,不要手动输入类名,IDE会自动识别Scala入口类的正确配置 - 保持Manifest默认输出路径为
src/META-INF,不要修改到resources或者其他目录 - 最小测试场景下选择"extract to the target JAR"即可,后续打Spark任务包时再调整依赖打包规则
- 保存配置后,执行Build -> Build Artifacts,先选择Clean清理旧构建产物,再选择Build重新打包。
- 打包完成后先做校验:执行命令
jar tf 你的JAR文件名.jar,确认输出内容中包含META-INF/MANIFEST.MF、superSimpleTest.class、superSimpleTest$.class三个条目,再执行java -jar 你的JAR文件名.jar即可正常运行。
Spark打包额外提示
后续打包提交到Spark集群的任务JAR时,记得把Scala标准库、Spark核心依赖的级别设置为Provided,不要把这些依赖打进JAR包,避免和集群预装的依赖版本冲突报错。
内容的提问来源于stack exchange,提问作者Kasper
相关产品推荐
相关产品推荐

