java 11+支持直接运行java test.java,因jvm隐式调用内置编译器完成编译与执行;需java -version≥11,且中文源码须指定--encoding utf-8或统一保存为utf-8无bom格式。

java Test.java 能直接运行的前提条件
必须使用 OpenJDK 11 或更高版本(JEP 330 实现),且 java 命令本身来自该 JDK —— 低版本(如 JDK 8)执行 java Test.java 会报错:Error: Could not find or load main class Test.java。Windows、Linux、macOS 均支持,但需确认 java -version 输出的版本号 ≥ 11。
为什么不用 javac 编译也能跑
不是跳过了编译,而是由 JVM 在运行时隐式调用内置编译器完成“源码到字节码”的转换,再立即加载执行。整个过程对用户透明,但底层仍走标准的 javac 流程(来自 jdk.compiler 模块)。你可以用 _JAVA_LAUNCHER_DEBUG=1 java Test.java 看到实际触发的是 jdk.compiler/com.sun.tools.javac.launcher.Main。
Shebang 方式在 Linux/macOS 上的实操要点
想把 .java 文件当脚本直接执行(如 ./hello),需满足:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 文件首行必须是
#!/usr/bin/java --source 17(--source版本号要与代码语法兼容,比如用了var就得 ≥ 10,用了record就得 ≥ 14) - 文件无扩展名(或扩展名不参与执行),例如保存为
hello而非hello.java - 赋予可执行权限:
chmod +x hello -
/usr/bin/java必须指向你期望的 JDK 11+,否则会因版本不匹配失败
常见坑:中文乱码与编码问题
直接运行 java Test.java 时,如果源文件含中文(如 System.out.println("你好");),默认按系统编码读取。Windows 控制台通常是 GBK,而 JDK 默认用 UTF-8 解析,会导致编译失败或输出乱码。解决方式:
- 统一用 UTF-8 保存源文件(推荐,编辑器设为 UTF-8 无 BOM)
- 显式指定源码编码:
java --encoding UTF-8 Test.java - 避免在 Windows CMD 中直接运行,改用 PowerShell 或 WSL(更倾向 UTF-8)
这个细节容易被忽略——看似能跑通,但一旦涉及中文字符串或注释,就突然失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










