Notepad++运行Java的前提是系统已安装并正确配置JDK,需在CMD中验证javac -version和java -version均返回版本号;NppExec仅转发命令,关键参数包括-encoding UTF-8、-cp "$(CURRENT_DIRECTORY)"和-Dfile.encoding=UTF-8,Swing程序必须用SwingUtilities.invokeLater启动GUI。

Notepad++ 本身不带 Java 运行能力,能跑起来的唯一前提是:系统已装好 JDK,且 javac 和 java 命令能在 CMD 中直接调用。NppExec 只是把命令“转发”过去,它不解决 JDK 缺失、路径错、编码乱这些底层问题。
确认 JDK 是否真正可用
别跳过这步——90% 的失败都卡在这里。Notepad++ 不会报“JDK 没装”,它只会静默失败或报 ‘javac’ is not recognized。
- 打开 CMD(不是 PowerShell),执行:
javac -version和java -version,必须都输出类似17.0.1的版本号 - 如果报错,检查系统环境变量:
JAVA_HOME指向 JDK 根目录(如C:\Program Files\Java\jdk-17.0.1),且%JAVA_HOME%\bin已加入PATH - 避免用中文路径装 JDK;
C:\Program Files\Java\...这种含空格路径,必须用双引号包裹命令中的可执行文件路径,比如:"C:\Program Files\Java\jdk-17.0.1\bin\javac.exe"
NppExec 脚本里必须加的三个关键参数
光写 javac HelloWorld.java 和 java HelloWorld 很容易编译成功但运行报错,尤其含中文或 Swing 时。
-
-encoding UTF-8:强制源码按 UTF-8 解析,否则中文注释/字符串会编译报错或乱码 -
-cp "$(CURRENT_DIRECTORY)":显式指定类路径为当前目录,避免NoClassDefFoundError -
-Dfile.encoding=UTF-8:让java启动时用 UTF-8 读取 class 文件和控制台输入输出,否则System.out.println("你好")显示为方块
完整脚本示例(F6 输入后保存为 run_java):
立即学习“Java免费学习笔记(深入)”;
NPP_SAVE cd "$(CURRENT_DIRECTORY)" javac -encoding UTF-8 "$(FILE_NAME)" if $(EXITCODE) == 0 java -cp "$(CURRENT_DIRECTORY)" -Dfile.encoding=UTF-8 "$(NAME_PART)"
Swing 程序跑不出窗口?检查主线程和工作目录
不是 NppExec 的锅,是 Swing 自身限制:GUI 必须在事件调度线程(EDT)启动,且工作目录若不对,资源路径(如图片、配置文件)会加载失败。
- 主类必须用
SwingUtilities.invokeLater(...)包裹 GUI 创建逻辑,否则可能黑屏或卡死 -
$(CURRENT_DIRECTORY)是 Notepad++ 当前打开文件所在目录,不是你双击 .java 文件时的“桌面”或“文档”目录——确保所有资源(如icon.png)放在此目录下 - 不要用
java -jar app.jar方式运行 Swing 类;NppExec 脚本只适合单文件快速验证,复杂项目建议用构建工具
F6 执行后控制台一闪而过,根本看不到输出
这不是脚本写错了,是 NppExec 默认行为:命令结束就关闭控制台。尤其当程序没阻塞(比如没 Scanner.nextLine())时,输出瞬间消失。
- 最简单解法:在脚本末尾加
& pause,例如:java -Dfile.encoding=UTF-8 "$(NAME_PART)" & pause - 更规范做法:开头加
npp_console 1,结尾加npp_console 0,强制保持控制台可见 - 如果用了
System.in却没反应,加-u参数启用无缓冲模式:java -u -Dfile.encoding=UTF-8 "$(NAME_PART)"
真正麻烦的是路径和编码混在一起的问题:一个错,全盘失效。比如 javac 成功了,但 java 找不到主类,往往是因为 $(NAME_PART) 取出的名字和 public class 名不一致,或者文件名大小写和类名不匹配(Windows 不敏感,Linux 敏感)。这类细节不报错,只静默失败。


















