sublime text 本身不带 java 编译器或 jvm,所谓“一键编译运行”即调用系统已安装的 javac 和 java 命令,前提是二者在 sublime 启动时能被正确找到;报错“'javac' is not recognized”是因为 sublime 未继承终端配置的 path,需确认 where javac(windows)或 which javac(macos/linux)有输出,并彻底重启 sublime 验证;构建系统中必须使用 -d . 确保 package 结构与 class 输出路径一致,配合 -cp . 和 utf-8 编码才能避免 noclassdeffounderror、中文乱码及类名不匹配等问题。

Sublime Text 本身不带 Java 编译器或 JVM,所谓“一键编译运行”,就是让它调用你系统里已装好的 javac 和 java 命令——前提是这两个命令在 Sublime 启动时能被正确找到,否则所有配置都无效。
为什么按 Ctrl+B 报错 “'javac' is not recognized”
这不是 Sublime 的 bug,是它根本没找到 javac 可执行文件。Sublime 启动时继承的是系统默认环境变量,不是你终端里改过的那个。
- Windows:打开命令提示符,运行
where javac;没输出就说明%JAVA_HOME%\bin没进系统Path(只设JAVA_HOME不够) - macOS/Linux:在终端运行
which javac;若为空,检查$PATH是否含$JAVA_HOME/bin,并确认~/.zshrc或~/.bash_profile已被正确加载 - 改完环境变量后,必须彻底退出 Sublime(任务管理器杀进程 / Activity Monitor 强制退出),再重开——否则它不会读新
PATH - 验证 Sublime 是否看见
javac:按Ctrl+`打开控制台,输入import os; print(os.environ.get('PATH')),搜java或jdk路径
Java.sublime-build 中 -d . 是关键,不是可选项
一旦源码里写了 package com.example;,不加 -d . 就必然报 NoClassDefFoundError 或 ClassNotFoundException。因为 javac 默认把 .class 文件平铺扔进当前目录,而 java 运行时会按包名去找 com/example/Main.class。
-
"shell_cmd":"javac -encoding UTF-8 -d . \"${file}\" && java -cp . \"${file_base_name}\""—— 这是最小可用组合 -
-d .让javac自动创建./com/example/目录结构,并把 class 放对位置 -
-cp .告诉java从当前目录开始找类,和-d .输出路径严格对应 - 如果用
-d \"${file_path}\",会导致 class 被写进源文件同级目录,但 package 层级缺失,java仍找不到
中文乱码、类名不匹配、无交互支持这些坑藏得深
表面是构建失败,实际常是编码、命名或运行方式错位。
- Windows 下控制台输出中文乱码:必须在构建系统里显式加
"encoding":"utf-8",且源文件保存为 UTF-8(无 BOM) - 报错
error: class Hello is public, should be declared in a file named Hello.java:说明文件名和public class名不一致,Sublime 不校验这个,但javac会拒编 - 运行时卡住、没输出、无法输入:Sublime 的构建输出是只读流,
System.in无法响应,别指望交互式程序能正常跑 - 想用外部 jar 或多文件依赖?
JavaC插件和基础构建系统都不支持-cp或模块路径,得手动拼shell_cmd或换构建工具
最易被忽略的其实是工作目录和类路径的耦合关系:java 命令不认文件路径,只认类全名;而类全名又由 package + class 决定;这个结构又必须和 -d 输出的目录树完全一致——三者差一点,就报找不到类。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











