配置javac的核心就两步:装好JDK,再把JDK的bin目录写进系统Path变量,javac不是内部或外部命令、配置好了java仍不行,多数情况都是Path变量漏配或旧命令行窗口没重开。
先分清javac和java,才知道配置到底在配什么
很多新手把javac和java混为一谈,结果配置环境变量时总感觉不对,先看一张对比表,后面操作会顺畅很多。
| 命令 | 作用 | 处理文件 | 常见报错 |
|---|---|---|---|
| javac | 编译器,把源代码翻译成字节码 | .java → .class | javac不是内部或外部命令 |
| java | 启动器,运行字节码 | .class | 找不到或无法加载主类 |
javac和java的区别
- javac负责编译,java负责运行,两者都在JDK的bin目录下。
- 配置javac本质是配置JDK工具链路径,java命令会跟着一起可用。
- 如果只装了JRE,会有java但没有javac,这也是配置失败的主因之一。
配置javac不是单独配置一个命令,而是让操作系统能直接找到JDK里的所有可执行文件,Windows找命令的顺序是先看当前目录,再按Path变量从左到右搜索,Path里没有JDK的bin目录,命令行就报“javac不是内部或外部命令”。
javac不是内部或外部命令怎么解决
这是百度上搜索量很大的一个长尾问题,解决思路不复杂,但需要按顺序检查三处Path配置。
三个地方检查Path
- 用户变量Path:只对当前Windows账户生效。
- 系统变量Path:对所有账户生效。
- 是否写入了
%JAVA_HOME%\bin:很多人只建了JAVA_HOME变量,却忘了把它加进Path。
在Windows 10图形界面编辑Path时,每个条目是独立一行,不需要手写英文分号,但如果是在Windows 7或直接在变量值末尾追加,必须用英文分号和前面的内容隔开。
配完必须重开命令行
这几乎是新手最容易踩的坑,已经打开的CMD或PowerShell会继承旧的环境变量,不会自动刷新,配置完Path后:
- 关闭所有已打开的命令行窗口。
- 重新打开一个新的CMD。
- 执行
。
where javac
如果where javac能显示出JDK的bin目录路径,说明配置成功,如果还提示找不到,回到Path检查拼写和路径层级。
win10配置javac环境变量详细步骤
下面给出Windows 10下最稳的一套操作路径,适合完全没接触过环境变量的新手。
下载JDK
- 国内下载Oracle JDK速度不稳定,可以使用OpenJDK发行版,如Eclipse Temurin、Azul Zulu。
- 这些发行版免费商用,不需要注册账号。
- 安装路径避免中文和空格,推荐类似
C:\Java\jdk-17这样的短路径。
设置JAVA_HOME和Path
- 打开设置 → 系统 → → 高级系统设置 → 环境变量。
- 在“系统变量”区域点击“新建”。
- 变量名输入
JAVA_HOME。 - 变量值输入JDK安装目录,例如
C:\Java\jdk-17,不要包含bin。 - 在“系统变量”列表中找到
Path,双击编辑。 - 点击“新建”,输入
%JAVA_HOME%\bin。 - 把这一项上移到Path列表最上方,避免旧版本JDK路径干扰。
这里解释一个高频疑问:为什么变量值不包含bin?因为JAVA_HOME代表JDK根目录,后面很多开发工具会默认拼接bin子目录,Path里则必须写到bin这一层,%JAVA_HOME%\bin就是完整可执行文件所在目录。
验证配置
- 新开CMD。
- 输入
javac -version。 - 输入
java -version。
两个命令都能显示版本号,说明javac环境变量配置完成,行业共识认为,验证环境变量是否生效的最直接方式就是查看命令能否被全局识别,而不是只看变量表里有没有写对。
javac配置好了java还是不行?按顺序排查
这个问题也经常出现在搜索里,表现为:java -version正常,但javac报错,或者两个都报错,按下面顺序排查,基本能覆盖大多数情况。
检查命令行窗口是否重启
- 未重启窗口会一直使用旧环境变量。
- 解决办法:完全关闭旧窗口,重新打开。
检查JAVA_HOME路径是否多了一层bin
- 错误示例:
C:\Java\jdk-17\bin - 正确示例:

C:\Java\jdk-17
- 如果JAVA_HOME多写了一层bin,Path里的
%JAVA_HOME%\bin实际会变成C:\Java\jdk-17\bin\bin,当然找不到。
检查Path里是否有多个JDK残留
- 执行
where java和where javac。 - 如果返回的路径不是你刚装的JDK,说明Path前面还有旧的JDK或JRE路径。
- 把
%JAVA_HOME%\bin上移到最上面,或者删除旧路径。
检查安装的是JRE还是JDK
- JRE只包含运行环境,没有javac编译器。
- 如果安装的是JRE,
java -version可能有输出,javac -version必报错。 - 解决办法:卸载JRE,改装JDK。
mac和linux配置javac环境变量要点
macOS和Linux配置javac的原理同为修改PATH,只是配置文件不同。
mac配置javac环境变量
- 推荐用Homebrew安装:
brew install openjdk@17。 - 安装完成后,路径一般在
/usr/local/opt/openjdk@17/bin。 - 编辑
~/.zshrc文件,加入:export PATH="/usr/local/opt/openjdk@17/bin:$PATH"
- 保存后执行
source ~/.zshrc。 - 输入
javac -version验证。
linux配置javac环境变量
- 下载JDK压缩包,解压到
/usr/local/jdk。 - 编辑
~/.bashrc或/etc/profile。 - 加入两行:
export JAVA_HOME=/usr/local/jdkexport PATH=$JAVA_HOME/bin:$PATH
- 执行
source ~/.bashrc使配置生效。 - Ubuntu用户也可以直接
sudo apt install default-jdk,安装后通常会自动配置好。
Linux下如果使用/etc/profile配置,属于全局设置,所有用户都能用;~/.bashrc只对当前用户生效。
免费配置javac的几种JDK选择
配置javac本身不需要任何费用,真正要选的是JDK发行版。
- Oracle JDK 17及以后版本可免费商用,但官网下载需要账号,国内速度一般。
- OpenJDK官方构建完全开源免费。
- Eclipse Temurin、Azul Zulu等发行版免费且提供安装包,适合Windows和macOS新手。
- 国内镜像如华为云、简米云提供OpenJDK下载,速度更快。

近年来越来越多开发团队从Oracle JDK切换到OpenJDK发行版,主要原因是授权更清晰,配置javac的操作步骤则完全一致。
从零配置javac到编译运行第一个程序
配置完环境变量后,用一个小例子验证全流程是否打通。
编写Hello.java
- 新建文本文件,命名为
Hello.java。public class Hello {public static void main(String[] args) {System.out.println("配置javac成功");
编译
- 打开CMD,cd到Hello.java所在目录。
- 执行
javac Hello.java。 - 目录下会生成
Hello.class文件。
运行
- 执行
java Hello。 - 注意不要加
.class后缀。 - 如果输出“配置javac成功”,说明javac和java协同正常。
中文乱码处理
- 如果编译报“编码GBK的不可映射字符”,执行:
javac -encoding UTF-8 Hello.java
- 原因是javac默认读取操作系统平台编码,Windows中文版默认GBK,源文件是UTF-8就会冲突。
配置javac这件事,说到底就是让操作系统在任意目录下都能找到JDK的bin目录,安装JDK、写对JAVA_HOME和Path、重开命令行,这三步走完,javac和java就能同时正常工作。
与配置javac相关的常见问题
配置javac需要花钱吗?
不需要,OpenJDK及多数发行版免费商用,Windows、macOS、Linux均可零成本完成javac环境变量配置。
win7配置javac环境变量和win10一样吗?
思路完全一样,都是设置JAVA_HOME和Path,区别在于win7的Path是一个单行文本框,需要在变量值末尾追加英文分号和%JAVA_HOME%\bin,操作上更容易出错,业内专家指出,老系统配置环境变量时,手写分号的失误率相对更高,建议直接复制粘贴路径。
javac编译报错“编码GBK的不可映射字符”怎么处理?
执行javac -encoding UTF-8 文件名.java显式指定源文件编码,也可以把Java源文件另存为ANSI或GBK格式,从源头和javac的默认编码保持一致,javac在不指定encoding参数时使用平台默认编码,Windows中文版默认是GBK。
