javac -version 查编译器版本,反映jdk中javac所属版本,用于确认.java能否编译为.class;java -version 查jvm版本,反映运行时环境版本,用于确认.class能否被加载执行;二者可能不一致,需确保兼容以避免字节码版本冲突。

javac -version 和 java -version 看似相似,但查的不是同一个东西,用途也完全不同。
javac -version 查的是编译器版本
它显示当前系统使用的 javac(Java 编译器)属于哪个 JDK 版本。比如输出 javac 17.0.4,说明你安装的是 JDK 17 的某个更新版,且 javac 可用。这个命令只关心“能不能把 .java 文件编译成 .class”。
java -version 查的是运行环境版本
它显示当前 java 命令对应的 JVM(Java 虚拟机)版本,也就是实际执行字节码的那套运行时环境。比如输出 java version "17.0.4",代表 JVM 是 JDK 17 自带的,能加载并运行 .class 文件。这个命令只关心“能不能跑已编译好的程序”。
两者可能不一致,常见情况包括:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 系统 PATH 中配置了多个 JDK,
javac指向一个版本,java指向另一个 - 误将 JRE 的
bin目录加进了 PATH(JRE 没有javac,javac -version会报错) - 使用 IDE 或构建工具(如 Maven)内置了独立 JDK,但终端默认用的是系统全局 JDK
验证是否正常工作的简单方式:
- 运行
javac -version和java -version都应成功输出版本号 - 若其中一个报“不是内部或外部命令”,大概率是 PATH 没配对,或者只装了 JRE(没
javac) - 二者版本号建议尽量一致,避免编译用 JDK 21、运行却用 JVM 8 这类兼容性问题(比如 Java 21 编译的 class 文件默认是 v65 字节码,JVM 8 最高只支持 v52)
本质上:javac 属于开发阶段工具,归 JDK 管;java 是运行阶段入口,由 JRE 或 JDK 中的 JRE 部分提供。
装了完整 JDK,这两个命令才都有;只装 JRE,就只有 java,没有 javac。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










