sublime 中不能直接在 build system 里运行 spark-submit,因其不支持交互式进程且未加载 sbt 构建的 classpath 和依赖;正确做法是用 shell 脚本封装 sbt compile 与 spark-submit,并通过 build system 调用该脚本。

Sublime 里跑不了 spark-submit?别硬塞进 Build System
直接在 Sublime 的 Build System 里写 spark-submit 命令,十有八九会卡住、无输出、或报 NoClassDefFoundError——因为 Build System 不支持交互式进程,也不加载 sbt 构建后的 classpath 和依赖 JAR。
- Spark 应用必须由
sbt compile产出 class 文件,并通过spark-submit加载完整依赖树;裸调spark-submit --class Main ...时,Sublime 根本没把 target/scala-*/classes/ 和 ~/.sbt/boot/ 下的依赖路径传进去 - 正确做法是用 shell 脚本封装:写个
run-spark.sh,内容类似:#!/bin/bash sbt clean compile && \ spark-submit \ --master local[*] \ --class "$1" \ target/scala-2.13/myapp_2.13-0.1.jar
- 再配一个 Build System,
shell_cmd指向这个脚本:"shell_cmd": "./run-spark.sh MyApp",注意确保脚本有执行权限(chmod +x run-spark.sh)
为什么 Metals 补全不弹、跳转失败?三处必查
补全和跳转失效不是插件没装全,而是 LSP 链路断在某个环节。Metals 启动依赖 Java、项目结构、PATH 三者同时就位,缺一不可。
-
java -version必须输出 JDK(含jdk-字样),不能是 JRE;且$JAVA_HOME/bin要在 PATH 里——Sublime GUI 启动时若没继承 PATH,LSP 就根本找不到java,日志卡在Starting server -
build.sbt必须放在你用File → Open Folder打开的**根目录下**,不能藏在src/或project/里;Metals 启动时会扫描根目录找 build 文件,找不到就报No build target found - 确认已安装
LSP(作者 sublimelsp)和LSP-metals(作者 tombry),不是 “Metals for Sublime” 等非官方包;后者不维护、不兼容 BSP 协议,启动后连日志都不打
Build System 编译报错但点不了跳转?file_regex 写错了
双击错误信息跳不到对应行,90% 是 file_regex 没匹配上 Scala 编译器的真实错误格式。Scala 错误是 MyApp.scala:5: error: not found: value x,正则必须捕获文件名和行号,列号要忽略。
- 正确写法:
"file_regex": "^([^:]+):([0-9]+):(?:[0-9]+):"——第一组([^:]+)提取文件名,第二组([0-9]+)提取行号,第三段列号用(?:[0-9]+):非捕获组跳过 - 千万别抄通用模板
"^.*?:([0-9]+):([0-9]+):",它会吞掉文件名,导致双击跳到空文件或错误文件 - 必须配合
2>&1使用:"shell_cmd": "scalac $file 2>&1",否则错误走 stderr,file_regex根本捕获不到
Sublime 启动后找不到 scalac?GUI 启动不继承 PATH 是主因
终端里 scalac -version 正常,但 Sublime 里构建报 command not found,问题不在插件,而在环境变量没透进来。
- macOS:从 Dock 或 Spotlight 启动 Sublime 时,PATH 完全丢失;必须用终端执行
open -a "Sublime Text"启动,才能加载~/.zshrc中的 PATH - Linux:桌面图标双击启动同样不继承 shell PATH;改用终端运行
subl(需先软链:sudo ln -s /opt/sublime_text/subl /usr/local/bin/subl) - Windows:检查系统环境变量
Path是否包含scala\bin,改完后必须彻底退出 Sublime 进程(右键任务栏 → Exit),不能只关窗口 - 验证方式:按
Ctrl+`打开控制台,输入import os; print(os.environ.get('PATH')),确认输出里有scala/bin路径











