最后更新:2026-06-11
适用系统:Windows 10 / Windows 11
适用场景:javac 不是内部或外部命令、java 正常但 javac 不正常、JDK 环境变量配置错误、JAVA_HOME 配置不生效、Path 中 Java 路径错误

在 Windows 上安装 Java 后,很多人执行:

javac -version

会遇到下面这个错误:

'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。

或者英文系统显示:

'javac' is not recognized as an internal or external command,
operable program or batch file.

这个问题非常常见,尤其是刚安装 JDK、配置 JAVA_HOME、切换多个 JDK 版本时。

先说结论:javac 找不到,通常不是 Java 安装失败,而是当前系统没有找到 JDK 的 bin 目录。

常见原因包括:

只安装了 JRE,没有安装 JDK
JAVA_HOME 指向了错误目录
Path 没有添加 %JAVA_HOME%\bin
Path 中旧 Java 路径排在前面
命令行窗口没有重新打开
安装目录选错了
IDEA / Maven 使用了另一个 JDK

如果你还没有安装 JDK,可以先看:

Windows安装JDK 8 / 17 / 21 / 25完整教程:JAVA_HOME环境变量配置与验证


一、先说结论:javac 是 JDK 里的编译器

javac 是 Java 编译器,用来把 .java 源码编译成 .class 字节码文件。

例如:

javac HelloWorld.java

编译后会生成:

HelloWorld.class

所以,javac 来自 JDK 的 bin 目录。

例如 JDK 安装在:

D:\Java\jdk-17

那么 javac.exe 应该在:

D:\Java\jdk-17\bin\javac.exe

如果系统找不到这个文件,就会报:

javac 不是内部或外部命令

二、先检查 java 和 javac 是否都正常

打开新的 CMD 或 PowerShell,执行:

java -version

再执行:

javac -version

可能会出现几种情况。

java -versionjavac -version说明
正常正常JDK 配置基本正常
正常报错可能只配置了 Java 运行环境,没找到 JDK 编译器
报错报错Java 环境变量整体没有配置好
显示旧版本显示新版本Path 中 Java 路径混乱
显示新版本显示旧版本java 和 javac 来自不同 JDK

最理想的结果是:

java -version  显示 JDK17
javac -version 显示 JDK17

或者:

java -version  显示 JDK21
javac -version 显示 JDK21

二者版本应该一致。


三、用 where 命令查看 javac 实际路径

在 CMD 中执行:

where javac

PowerShell 中建议执行:

where.exe javac

如果配置正常,输出类似:

D:\Java\jdk-17\bin\javac.exe

如果提示:

信息: 用提供的模式无法找到文件。

说明系统当前 Path 中找不到 javac.exe

再执行:

where java

正常应该类似:

D:\Java\jdk-17\bin\java.exe

如果 where java 有结果,但 where javac 没结果,通常是下面几种情况:

1. 当前 java.exe 不是来自完整 JDK
2. Path 指向了 JRE 或 Oracle javapath
3. JAVA_HOME 配置错误
4. Path 没有正确添加 %JAVA_HOME%\bin

四、检查是否安装了 JDK,而不是 JRE

开发 Java 项目必须安装 JDK。

JDK 包含:

java
javac
jar
javadoc
jdb
keytool

而 JRE 主要用于运行 Java 程序,不适合用来开发和编译 Java 项目。

你可以进入 JDK 安装目录,查看是否有:

bin\javac.exe

例如:

D:\Java\jdk-17\bin\javac.exe

如果没有 javac.exe,说明你当前目录不是完整 JDK。

解决办法:

重新下载并安装 JDK,不要只安装 JRE。

推荐下载 JDK,而不是 JRE:

Package Type: JDK

如果你不知道去哪里下载,可以看:

各版本JDK镜像下载地址:JDK8 / JDK11 / JDK17 / JDK21 / JDK25 / JDK26 下载与IDEA配置指南


五、检查 JAVA_HOME 是否正确

在 CMD 中执行:

echo %JAVA_HOME%

PowerShell 中执行:

echo $env:JAVA_HOME

正确输出应该是 JDK 根目录,例如:

D:\Java\jdk-17

或者:

D:\Java\jdk-21

错误写法一:

D:\Java\jdk-17\bin

错误写法二:

D:\Java\jdk-17;

错误写法三:

"D:\Java\jdk-17"

注意:JAVA_HOME 应该指向 JDK 根目录,不是 bin 目录。

正确:

JAVA_HOME=D:\Java\jdk-17

Path 中再添加:

%JAVA_HOME%\bin

六、检查 Path 是否包含 %JAVA_HOME%\bin

打开环境变量:

此电脑 > 右键 > 属性 > 高级系统设置 > 环境变量

或者开始菜单搜索:

环境变量

找到:

系统变量 > Path

检查是否有这一项:

%JAVA_HOME%\bin

如果没有,就新增一行:

%JAVA_HOME%\bin

不要只配置 JAVA_HOME,还必须让 Path 能找到 JDK 的 bin 目录。

推荐配置:

JAVA_HOME = D:\Java\jdk-17
Path      = %JAVA_HOME%\bin

不推荐直接写死:

D:\Java\jdk-17\bin

虽然这样也能用,但以后切换 JDK 时还要改 Path。更好的方式是只改 JAVA_HOME


七、修改环境变量后要重新打开命令行

修改 Windows 环境变量后,已经打开的 CMD、PowerShell、Windows Terminal、IDEA Terminal 不一定会立即生效。

所以你改完后,要这样做:

1. 关闭所有 CMD / PowerShell / Windows Terminal
2. 重新打开一个新的命令行窗口
3. 执行 java -version
4. 执行 javac -version
5. 执行 where javac

如果是在 IDEA 里的 Terminal 中测试,也建议:

关闭 IDEA Terminal
重新打开 Terminal

必要时重启 IDEA。

一般不需要重启电脑,但如果你改完很多次仍然不生效,可以最后再重启系统。


八、Path 里旧 Java 路径可能影响 javac

如果你以前安装过 JDK8、Oracle JDK、JRE,Path 里可能有旧路径。

常见旧路径:

C:\Program Files\Common Files\Oracle\Java\javapath
C:\Program Files\Java\jdk1.8.0_xxx\bin
C:\Program Files\Java\jre1.8.0_xxx\bin

这些路径如果排在:

%JAVA_HOME%\bin

前面,就可能导致系统先找到旧版本 Java。

执行:

where java
where javac

如果输出类似:

C:\Program Files\Common Files\Oracle\Java\javapath\java.exe
D:\Java\jdk-17\bin\java.exe

说明 Oracle 的 javapath 抢在前面了。

建议处理:

1. 打开系统 Path
2. 找到旧 Java 路径
3. 删除或移动到 %JAVA_HOME%\bin 后面
4. 确保 %JAVA_HOME%\bin 排在前面
5. 保存后重新打开命令行

理想情况是:

where java
D:\Java\jdk-17\bin\java.exe

where javac
D:\Java\jdk-17\bin\javac.exe

九、java 正常但 javac 不正常怎么办?

这是最常见的情况。

例如:

java -version

正常:

java version "1.8.0_361"

但:

javac -version

报错:

javac 不是内部或外部命令

常见原因:

1. 当前 java 来自 JRE
2. Path 中只有 java.exe 的路径,没有 javac.exe
3. JAVA_HOME 指向了错误目录
4. Oracle javapath 中没有正确的 javac
5. 没安装完整 JDK

解决顺序:

1. 确认 JDK 目录中有 bin\javac.exe
2. 设置 JAVA_HOME 到 JDK 根目录
3. Path 添加 %JAVA_HOME%\bin
4. 删除或下移旧 Java 路径
5. 重新打开命令行
6. 执行 where java 和 where javac

十、java 和 javac 版本不一致怎么办?

有时会出现:

java -version  -> 1.8.0_xxx
javac -version -> 17.0.x

或者:

java -version  -> 17.0.x
javac -version -> 1.8.0_xxx

这说明 java.exejavac.exe 来自不同目录。

执行:

where java
where javac

如果看到类似:

where java
C:\Program Files\Common Files\Oracle\Java\javapath\java.exe
D:\Java\jdk-17\bin\java.exe

where javac
D:\Java\jdk-17\bin\javac.exe

那就是 Path 顺序混乱。

解决办法:

1. Path 中只保留 %JAVA_HOME%\bin
2. 删除或下移旧 Java 路径
3. 重新打开命令行
4. 再次执行 java -version 和 javac -version

二者应该来自同一个 JDK。


十一、Windows 多 JDK 环境下如何避免 javac 混乱?

如果你电脑上同时有多个 JDK:

D:\Java\jdk-8
D:\Java\jdk-11
D:\Java\jdk-17
D:\Java\jdk-21
D:\Java\jdk-25

建议只这样配置:

JAVA_HOME=D:\Java\jdk-17
Path=%JAVA_HOME%\bin

不要在 Path 里同时放:

D:\Java\jdk-8\bin
D:\Java\jdk-11\bin
D:\Java\jdk-17\bin
D:\Java\jdk-21\bin

这会让版本切换变得很难排查。

切换 JDK 时,只改:

JAVA_HOME

例如切换到 JDK21:

JAVA_HOME=D:\Java\jdk-21

然后重新打开命令行,验证:

java -version
javac -version
where java
where javac

十二、临时切换 javac 版本

有时候你只是想临时测试某个 JDK,不想改系统环境变量。

CMD 临时切换到 JDK21:

set JAVA_HOME=D:\Java\jdk-21
set PATH=%JAVA_HOME%\bin;%PATH%
java -version
javac -version

PowerShell 临时切换:

$env:JAVA_HOME="D:\Java\jdk-21"
$env:Path="$env:JAVA_HOME\bin;$env:Path"
java -version
javac -version

注意:这种方式只对当前窗口有效,关闭窗口后失效。

适合临时测试:

某个项目能否用 JDK21 编译
某个 Maven 构建是否依赖特定 JDK
某个 Gradle 项目是否兼容新 JDK

十三、IDEA 里 javac 报错怎么办?

有时候命令行里 javac -version 正常,但 IDEA 里仍然报编译错误。

常见错误:

Cannot start compilation: no JDK configured
java: invalid source release: 17
No compiler is provided in this environment
Project SDK is not defined

这说明 IDEA 没有使用你命令行中的 JDK。

检查这些位置:

File > Project Structure > Project > Project SDK
File > Project Structure > Modules > Dependencies > Module SDK
Settings > Build Tools > Maven > Runner > JRE
Settings > Build Tools > Gradle > Gradle JVM
Run > Edit Configurations > JRE

建议统一成项目要求的 JDK。

例如项目使用 JDK17:

Project SDK = JDK17
Module SDK = Project SDK
Maven Runner JRE = JDK17
Gradle JVM = JDK17
Run Configuration JRE = Project SDK

详细教程可以看:

IDEA下载JDK很慢怎么办?手动配置本地JDK完整教程


十四、Maven 报 No compiler is provided 怎么办?

Maven 项目中经常遇到:

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

这个错误和 javac 找不到高度相关。

意思是:

Maven 当前运行环境没有找到 Java 编译器

常见原因:

1. Maven 使用的是 JRE
2. JAVA_HOME 指向错误
3. IDEA Maven Runner JRE 选错
4. 系统 Path 中 Java 路径混乱

先执行:

mvn -version

重点看:

Java version
Java home

如果项目需要 JDK17,但这里显示 JRE 或 JDK8,就要修正。

Maven Runner JRE 检查路径:

Settings > Build Tools > Maven > Runner > JRE

建议选择:

Project JDK

或者指定:

JDK17
JDK21

Maven 依赖下载失败可以看:

Maven Could not transfer artifact 下载失败解决:settings.xml、国内镜像、本地缓存与代理排查


十五、Maven 编译版本也要检查

即使 javac 正常,Maven 编译版本也可能不对。

如果项目是 JDK17,建议在 pom.xml 中写:

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

如果项目是 JDK21:

<properties>
    <maven.compiler.release>21</maven.compiler.release>
</properties>

如果项目是 JDK8:

<properties>
    <maven.compiler.release>8</maven.compiler.release>
</properties>

老项目也常见:

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
</properties>

但 JDK9 以后更建议使用:

<maven.compiler.release>

如果你遇到:

invalid source release: 17

通常是:

当前 Maven 使用的 JDK 版本低于 17

比如你用 JDK8 去编译 release 17,就会失败。


十六、Gradle 中 javac 不生效怎么办?

Gradle 项目中,如果 JDK 配置错误,也可能出现编译器相关问题。

先执行:

gradlew.bat --version

或者:

./gradlew --version

重点看:

JVM

如果 JVM 版本不对,检查:

JAVA_HOME
Path
IDEA Gradle JVM
Java Toolchain

Gradle 项目建议使用 Java Toolchain。

JDK17:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

JDK21:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

Gradle 下载慢可以看:

Gradle国内镜像配置教程:init.gradle、repositories与Wrapper加速完整指南


十七、用一个 HelloWorld 测试 javac 是否正常

你可以新建一个文件:

HelloWorld.java

内容:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

在当前目录执行:

javac HelloWorld.java

如果成功,会生成:

HelloWorld.class

然后执行:

java HelloWorld

正常输出:

Hello, Java!

如果 javac HelloWorld.java 失败,说明编译器配置仍然有问题。

如果 javac 成功但 java HelloWorld 失败,可能是当前目录、包名、classpath 或 Java 版本问题。


十八、有 package 的 Java 文件怎么编译?

如果你的 Java 文件里有包名:

package com.example;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

文件路径应该是:

com\example\HelloWorld.java

编译:

javac com\example\HelloWorld.java

运行:

java com.example.HelloWorld

注意不要写:

java com\example\HelloWorld

也不要写:

java HelloWorld

因为带 package 的类要使用完整类名运行。

这类问题和 javac 是否安装成功不是一回事,不要混在一起判断。


十九、完整排查清单

遇到 javac 不是内部或外部命令,按下面顺序检查:

1. 确认安装的是 JDK,不是 JRE
2. 确认 JDK 目录下有 bin\javac.exe
3. 执行 java -version
4. 执行 javac -version
5. 执行 echo %JAVA_HOME%
6. 执行 where java
7. 执行 where javac
8. 确认 JAVA_HOME 指向 JDK 根目录
9. 确认 Path 包含 %JAVA_HOME%\bin
10. 确认 Path 中旧 Java 路径没有排在前面
11. 删除或下移 Oracle javapath
12. 关闭并重新打开命令行
13. 检查 IDEA Project SDK
14. 检查 Maven Runner JRE
15. 检查 Gradle JVM
16. 用 HelloWorld.java 测试编译和运行

PowerShell 命令:

java -version
javac -version
echo $env:JAVA_HOME
where.exe java
where.exe javac

二十、推荐最终配置

假设你使用 JDK17:

JDK目录:
D:\Java\jdk-17

JAVA_HOME:
D:\Java\jdk-17

Path:
%JAVA_HOME%\bin

验证命令:

echo %JAVA_HOME%
where java
where javac
java -version
javac -version

理想输出路径:

D:\Java\jdk-17\bin\java.exe
D:\Java\jdk-17\bin\javac.exe

如果使用 JDK21:

JAVA_HOME=D:\Java\jdk-21
Path=%JAVA_HOME%\bin

切换版本时只改 JAVA_HOME,不要反复改 Path。


二十一、常见问题 FAQ

1. javac 是什么?

javac 是 Java 编译器,用来把 .java 文件编译成 .class 文件。

例如:

javac HelloWorld.java

2. 为什么 java 能用,javac 不能用?

常见原因是当前环境能找到 java.exe,但找不到 javac.exe

这通常说明:

1. 只安装了 JRE
2. Path 没有指向 JDK 的 bin 目录
3. JAVA_HOME 配置错了
4. java 和 javac 来自不同目录

3. JRE 里有 javac 吗?

通常没有。

开发 Java 项目请安装 JDK。


4. JAVA_HOME 要写到 bin 吗?

不要。

正确:

JAVA_HOME=D:\Java\jdk-17

Path 中添加:

%JAVA_HOME%\bin

5. where javac 找不到怎么办?

说明当前 Path 中没有可用的 javac.exe

检查:

1. JDK 是否安装完整
2. JAVA_HOME 是否正确
3. Path 是否包含 %JAVA_HOME%\bin
4. 命令行是否重新打开

6. java 和 javac 版本不一致怎么办?

执行:

where java
where javac

看它们分别来自哪个目录。

然后调整 Path,确保二者都来自同一个 JDK。


7. IDEA 里报 javac 相关错误怎么办?

检查:

Project SDK
Module SDK
Maven Runner JRE
Gradle JVM
Run Configuration JRE

命令行配置正确,不代表 IDEA 一定使用同一个 JDK。


8. Maven 报 No compiler is provided 和 javac 有关系吗?

有关系。

这个错误通常表示 Maven 当前运行环境没有可用的 Java 编译器,常见原因是 Maven 使用了 JRE 或错误 JDK。

执行:

mvn -version

Java home 是否正确。


9. 需要配置 CLASSPATH 吗?

普通现代 Java 开发一般不需要手动配置全局 CLASSPATH

新手只需要先配置好:

JAVA_HOME
Path

Maven / Gradle 项目会自己管理依赖和 classpath。


10. 改完环境变量必须重启电脑吗?

通常不用。

先关闭并重新打开命令行即可。

如果还是不生效,再重启 IDEA、Windows Terminal,最后才考虑重启电脑。


二十二、最终总结

javac 不是内部或外部命令 的核心原因通常是:

系统没有找到 JDK 的 bin 目录

记住这几个规则:

开发 Java 要安装 JDK,不是 JRE
JAVA_HOME 指向 JDK 根目录
Path 添加 %JAVA_HOME%\bin
不要把 JAVA_HOME 指到 bin
不要在 Path 里堆多个 JDK
用 where javac 查看真实路径
修改环境变量后重新打开命令行
IDEA / Maven / Gradle 也要单独检查 JDK

推荐最终配置:

JAVA_HOME=D:\Java\jdk-17
Path=%JAVA_HOME%\bin

验证:

java -version
javac -version
where java
where javac

如果 java.exejavac.exe 都来自同一个 JDK 目录,问题基本就解决了。


二十三、相关文章

Windows 安装 JDK 可以看:

Windows安装JDK 8 / 17 / 21 / 25完整教程:JAVA_HOME环境变量配置与验证

如果配置 JAVA_HOME 后仍然显示旧版本,可以看:

Windows配置JAVA_HOME后不生效怎么办?java -version显示旧版本解决办法

JDK 下载地址可以看:

各版本JDK镜像下载地址:JDK8 / JDK11 / JDK17 / JDK21 / JDK25 / JDK26 下载与IDEA配置指南

IDEA 配置 JDK 可以看:

IDEA下载JDK很慢怎么办?手动配置本地JDK完整教程

Maven 下载依赖失败可以看:

Maven Could not transfer artifact 下载失败解决:settings.xml、国内镜像、本地缓存与代理排查

完整 Java 环境配置可以看:

Java开发环境配置专题:JDK、IDEA、Maven、Gradle、版本兼容与常见报错


更新记录

2026-06-11:
- 创建 javac 不是内部或外部命令完整排查教程
- 增加 java / javac / where 命令检查方法
- 增加 JAVA_HOME 和 Path 配置说明
- 增加 java 正常但 javac 不正常的原因分析
- 增加 java 和 javac 版本不一致排查
- 增加 IDEA / Maven / Gradle 中 javac 相关问题排查
- 增加 HelloWorld.java 编译测试示例