Sublime构建Java需确保系统PATH包含JDK bin目录且Sublime继承该PATH,javac/java版本一致,单文件需指定编码和工作目录,带package时须匹配目录结构、使用-d.参数及全限定类名。

Sublime 构建系统本身不运行 Java 程序,它只是调用你系统里已安装的 javac 和 java 命令——如果这两个命令在 Sublime 启动时不可见,构建必然失败,且 90% 的问题卡在这一步。
为什么 Ctrl+B 报 “javac not found” 或一闪而过
这不是配置写错了,是 Sublime 根本没继承你终端里设好的 PATH。它不读 JAVA_HOME,也不加载 ~/.zshrc 或 Windows 用户环境变量。
- 先在终端(不是 Sublime 控制台)执行
which javac(macOS/Linux)或where javac(Windows),必须有明确输出,路径要指向 JDK 的bin目录(比如/usr/lib/jvm/jdk-17.0.1/bin/javac) -
javac -version和java -version必须都成功返回,且版本号一致(如都是 17.0.1) - 改完环境变量后,必须彻底退出 Sublime:Windows 用任务管理器杀掉所有
subl.exe,macOS 用 Activity Monitor 强制退出“Sublime Text”,再重开 - 验证是否生效:按
Ctrl+`打开 Sublime 控制台,输入import os; print(os.environ.get('PATH')),搜索jdk或java—— 没出现就说明没继承成功
无 package 声明的单文件怎么跑通
这是最简场景,但参数一个都不能少,否则编译成功、运行失败。
-
"shell_cmd":"javac -encoding UTF-8 "$file" && java "$file_base_name"":必须加-encoding UTF-8,否则中文注释/字符串会报“非法字符” -
"working_dir":"$file_path":必须指定,否则java在错误目录下找.class文件,报ClassNotFoundException - 文件名必须和
public class名完全一致(比如public class Hello→ 文件必须叫Hello.java) - 不要用默认的
JavaC.sublime-build,它只编译不运行;新建构建系统时直接粘贴上面那行命令
有 package com.example; 的项目怎么配
一旦写了 package,$file_base_name 就失效了,java 必须用全限定类名,且目录结构、工作目录、输出路径三者必须对齐。
立即学习“Java免费学习笔记(深入)”;
- 源文件必须放在对应路径下:
package com.example;→ 文件路径必须是com/example/Hello.java -
javac必须加-d .:让它自动创建./com/example/Hello.class,而不是平铺在当前目录 -
working_dir设为$file_path/../..(即com的上一级),让java能从根目录开始按包名找类 - 运行命令得写成
java "com.example.Hello",引号不能少,否则空格或特殊字符会出错 - 如果依赖外部 jar,得显式加
-cp ".:lib/some.jar"(macOS/Linux)或-cp ".;libsome.jar"(Windows)
Windows 下中文乱码、macOS 图形启动不继承环境
这两个是高频隐藏坑,表面报错不像,实际根源固定。
- Windows 控制台默认 GBK 编码,即使源码存为 UTF-8,
javac也会按 GBK 解析中文 → 必须在构建系统里加-encoding UTF-8,且确保文件保存为 UTF-8(无 BOM) - macOS 从 Dock 或 Launchpad 启动 Sublime 时,常不加载
~/.zshrc→ 改用终端执行open -a "Sublime Text",或装好subl命令后用subl .启动,才能继承 shell 环境 - 别信“我重启过了”,只关窗口不算重启;Windows 要杀进程,macOS 要强制 Quit,否则老 PATH 一直挂着
- 路径分隔符别混用:Windows 构建系统里
javac路径必须用双反斜杠C:\Program Files\Java\jdk-17.0.1\bin\javac,JSON 里单斜杠会解析失败
真正卡住人的从来不是 JSON 语法,而是 javac 路径没被看见、-d . 没加、或者 package 声明和文件路径差了一级目录——这三处错一个,ClassNotFoundException 就稳稳等着你。


















