javac未被识别为内部或外部命令、可操作的程序或批处理文件。

294

我在尝试编译Java程序时遇到了错误。

我使用的是Windows操作系统(这是一个特定于Windows的问题),并已安装最新的JDK。

我尝试了一种涉及“PATH”变量的解决方案,但错误仍然存在。

控制台输出:

C:\>set path=C:Program Files (x86)\Java\jdk1.7.0\bin
C:\>javac Hello.java
'javac' is not recognized as an internal or external command,
operable program or batch file.

9
我认为你的路径没有设置。请前往你的环境变量并在那里设置路径。 - Rahul Juyal
3
这个问题似乎不符合主题,因为它可以在实际JDK安装说明中轻松找到,那里的答案是最新的且比这里任何答案的质量更高。此外,在官方入门教程的第一章中,对于所有平台,该问题也很容易获得解决。 - Jason C
10
谢谢提供信息,Jason C。但我得承认,我觉得将这个帖子标记为离题与其他人点赞的数量似乎不太一致。就像我即将做的一样。 - Matt Stevens
1
当前链接:http://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jdk_install.html#BABGDJFH - Joseph Quinsey
添加一个新变量更容易,一旦你创建了一个新的变量 "PATH",请确保在值的末尾添加分号(;)。 - Amir Md Amiruzzaman
显示剩余4条评论
6个回答

536

简短易懂版

对于有经验的读者:

  1. 找到Java路径;它看起来像这样:C:\Program Files\Java\jdkxxxx\bin\
  2. 在开始菜单中搜索“环境变量”以打开选项对话框。
  3. 检查PATH。删除旧的Java路径。
  4. 将新的Java路径添加到PATH中。
  5. 编辑JAVA_HOME
  6. 关闭并重新打开控制台/IDE。

欢迎!

你遇到了Java初学者面临的最臭名昭著的技术问题之一:'xyz'不被识别为内部或外部命令...错误消息。

简而言之,你没有正确安装Java。在Windows上完成Java的安装需要一些手动步骤。你必须在安装Java后执行这些步骤,包括升级JDK后。

环境变量和PATH

(如果你已经理解了这个,可以跳过接下来的三个部分。)

当你运行javac HelloWorld.java时,cmd必须确定javac.exe的位置。这是通过PATH环境变量实现的。

环境变量是一种特殊的键值对(例如windir=C:\WINDOWS)。大多数环境变量随操作系统一起提供,并且一些环境变量对于系统正常运行是必需的。每个程序(包括cmd)启动时都会传递它们的列表。在Windows上,有两种类型用户环境变量系统环境变量

你可以像这样查看你的环境变量:

C:\>set
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\craig\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
...

最重要的变量是PATH。它是一个由;分隔的路径列表。当在cmd中输入命令时,列表中的每个目录都将被扫描以查找匹配的可执行文件。

在我的电脑上,PATH是:

C:\>echo %PATH%
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPower
Shell\v1.0\;C:\ProgramData\Microsoft\Windows\Start Menu\Programs;C:\Users\craig\AppData\
Roaming\Microsoft\Windows\Start Menu\Programs;C:\msys64\usr\bin;C:\msys64\mingw64\bin;C:\
msys64\mingw32\bin;C:\Program Files\nodejs\;C:\Program Files (x86)\Yarn\bin\;C:\Users\
craig\AppData\Local\Yarn\bin;C:\Program Files\Java\jdk-10.0.2\bin;C:\ProgramFiles\Git\cmd;
C:\Program Files\Oracle\VirtualBox;C:\Program Files\7-Zip\;C:\Program Files\PuTTY\;C:\
Program Files\launch4j;C:\Program Files (x86)\NSIS\Bin;C:\Program Files (x86)\Common Files
\Adobe\AGL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program
Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\iCLS Client\;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files
(x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\iCLS
Client\;C:\Users\craig\AppData\Local\Microsoft\WindowsApps

当你运行javac HelloWorld.java命令时,cmd会意识到javac不是一个内部命令,然后搜索系统PATH和用户PATH。它会自动进入列表中的每个目录,并检查是否存在javac.comjavac.exejavac.bat文件。当找到javac时,它会运行它。如果没有找到,则会打印出'javac' is not recognized as an internal or external command, operable program or batch file.
你必须将Java可执行文件目录添加到PATH中。

JDK与JRE

(如果您已经了解此内容,请随意跳过本节。)

下载Java时,您可以选择以下两种类型之一:
  • Java Runtime Environment(JRE)包含运行Java程序所需的必要工具,但不包括编译新程序所需的工具——它包含java但不包含javac
  • Java Development Kit(JDK)包含javajavac,以及其他一系列开发工具。JDK是JRE的超集。

您必须确保已安装JDK。如果只安装了JRE,则无法执行javac,因为您的硬盘上没有Java编译器的安装。检查Windows程序列表,并确保Java软件包的名称中包含“Development Kit”这几个单词。

不要使用set

(如果您原本不打算使用,请随意跳过此部分。)

其他几个答案建议执行以下某种变体:

C:\>:: DON'T DO THIS
C:\>set PATH=C:\Program Files\Java\jdk1.7.0_09\bin

不要这样做。这个命令有几个主要问题:

  1. 这个命令会删除PATH中的所有其他内容,并用Java路径替换它。执行此命令后,您可能会发现其他各种命令无法正常工作。
  2. 您的Java路径很可能不是C:\Program Files\Java\jdk1.7.0_09\bin - 您几乎肯定拥有更新版本的JDK,其路径将不同。
  3. 新的PATH仅适用于当前的cmd会话。每次打开命令提示符时,都需要重新输入set命令。

点#1和#2可以通过以下稍微更好的版本解决:

C:\>:: DON'T DO THIS EITHER
C:\>set PATH=C:\Program Files\Java\<enter the correct Java folder here>\bin;%PATH%

但总的来说,这只是一个糟糕的想法。

查找Java路径

正确的方法始于找到您安装Java的位置。这取决于您安装Java的方式。

Exe安装程序

您通过运行安装程序安装了Java。Oracle的安装程序将Java版本放置在C:\Program Files\Java\(或C:\Program Files (x86)\Java\)下。使用文件资源管理器或命令提示符导航到该目录。

每个子文件夹代表一个Java版本。如果只有一个,则已找到它。否则,请选择看起来像更新版本的那个。确保文件夹名称以jdk开头(而不是jre)。进入该目录。

然后进入其中的bin目录。

现在您已经进入了正确的目录。复制路径。如果在文件资源管理器中,请单击地址栏。如果在命令提示符中,请copy提示符。

生成的Java路径应为以下形式(不带引号):

C:\Program Files\Java\jdkxxxx\bin\

压缩文件

您已经下载了一个包含JDK的.zip文件。将其解压到一个不会干扰您的随机位置;C:\Java\是一个可接受的选择。

然后在其中找到bin文件夹。

现在您已经进入正确的目录。复制它的路径。这就是Java路径。

请记住,永远不要移动该文件夹,否则路径将无效。

打开设置对话框

那是编辑PATH的对话框。有许多方法可以打开该对话框,具体取决于您的Windows版本、UI设置以及系统配置是否混乱。
尝试以下几种方法:
  • 开始菜单/任务栏搜索框 » 搜索 "环境变量"
  • Win + R » control sysdm.cpl,,3
  • Win + R » SystemPropertiesAdvanced.exe » 环境变量
  • 文件资源管理器 » 在地址栏中输入 Control Panel\System and Security\System » 高级系统设置(左侧边栏) » 环境变量
  • 桌面 » 右键点击此电脑 » 属性 » 高级系统设置 » 环境变量
  • 开始菜单 » 右键点击计算机 » 属性 » 高级系统设置 » 环境变量
  • 控制面板(图标模式) » 系统 » 高级系统设置 » 环境变量
  • 控制面板(类别模式) » 系统和安全 » 系统 » 高级系统设置 » 环境变量
  • 桌面 » 右键点击我的电脑 » 高级 » 环境变量
  • 控制面板 » 系统 » 高级 » 环境变量
任何一种方法都可以打开正确的设置对话框。
如果您使用的是Windows 10,则Microsoft为您提供了新的漂亮的UI来编辑PATH。否则,您将看到完整的分号加密的PATH,挤在单行文本框中。尽最大努力进行必要的编辑,以免破坏系统。

清理 PATH

查看 PATH。你几乎肯定有两个 PATH 变量(因为用户和系统环境变量)。你需要查看这两个变量。

检查是否存在其他 Java 路径并将其删除。它们的存在可能会引起各种冲突。(例如,如果在 PATH 中有 JRE 8 和 JDK 11,那么 javac 将调用 Java 11 编译器,它将创建版本为 55 的 .class 文件,但 java 将调用只支持到版本 52 的 Java 8 JVM,你将遇到不支持的版本错误,无法编译和运行任何程序。)通过确保 PATH 中只有一个 Java 路径来避免这些问题。而且,你也可以卸载旧的 Java 版本。记住,你不需要同时安装 JDK 和 JRE。

如果你有 C:\ProgramData\Oracle\Java\javapath也要删除它。Oracle 的目的是通过创建一个符号链接,始终指向最新的 Java 安装来解决升级后 Java 路径被破坏的问题。不幸的是,它经常指向错误的位置或者根本无法工作。最好删除此条目并手动管理 Java 路径。
现在也是对 PATH 进行一般性清理的好时机。如果您的 PC 上没有安装与软件相关的路径,可以将其删除。您还可以重新排列路径的顺序(如果您关心这样的事情)。

添加到 PATH

现在,将三个步骤前找到的 Java 路径放入系统 PATH 中。
您的新路径出现在列表中的任何位置都没关系;将其放在末尾是一个很好的选择。
如果您使用的是 Windows 10 之前的用户界面,请确保已正确放置分号。在列表中,每个路径之间应该恰好有一个分号。
这里真的没有什么别的可说的了。只需将路径添加到 PATH 中,然后单击“确定”。

设置 JAVA_HOME

在此过程中,您可能需要设置JAVA_HOME。这是另一个环境变量,它应该包含Java路径。许多Java和非Java程序,包括流行的Java构建系统MavenGradle,如果未正确设置,则会抛出错误。

如果JAVA_HOME不存在,请将其创建为新的系统环境变量。将其设置为Java目录的路径,不包括bin/目录,即C:\Program Files\Java\jdkxxxx\

记得升级Java后也要编辑JAVA_HOME

关闭并重新打开命令提示符

虽然您已经修改了PATH,但所有正在运行的程序(包括cmd)只能看到旧的PATH。这是因为所有环境变量的列表只有在程序开始执行时才会被复制;之后,它只查询缓存副本。

没有很好的方法可以刷新cmd的环境变量,所以只需关闭命令提示符并再次打开它即可。如果您正在使用IDE,请关闭并重新打开它。

另请参阅


8
这个方法对我有用,但之前我尝试过在路径字符串末尾添加位置信息。为什么只有在路径开头才起作用? - Eric H.
4
谢谢!这对我有用! @Eric H:在末尾添加可以解决我的问题。据我所知,它会从左到右遍历路径并查找javac.exe。因此,也许您有一个位于前面的某个目录中的javac.exe无法运行。 - Dao Lam
40
关闭命令行窗口再重新打开,这对我起了作用!+1 - Sameh Deabes
如果我在计算机上有不同版本的JDK和JRE,这是否有意义? - Aaron Liu
哈哈,真不敢相信这竟然奏效了。我本来还以为要看完漫长的教程才能让一切正常呢。太感谢了,笑死我了。 - Duck Dodgers
显示剩余4条评论

78

试一下这个... 我之前也遇到过这个问题,但在XP中解决了。

C:\ YourFolder >set path=C:\Program Files\Java\jdk1.7.0_09\bin;
C:\ YourFolder >javac YourCode.java

48

你打错了set命令——在C:后面没有输入反斜杠。应该是:

C:\>set path=C:\Program Files (x86)\Java\jdk1.7.0\bin

1
我错过了那个问题,但那是我在这里发布我的问题时的排版错误。我确实检查过了,一切都拼写正确,但仍然出现相同的错误。 - user987137
1
@user987137。显然,有些地方不正确。JDK(注意是JDK而不是JRE)是否安装在指定位置 - C:\Program Files (x86)\Java\jdk1.7.0?如果是这样,请尝试运行命令cd C:\Program Files (x86)\Java\jdk1.7.0\binjavac -version,查看会发生什么。 - Raghuram
3
即使我已经设置了正确的路径,但在Win XP上安装JDK时仍然遇到了相同的错误。只需要关闭命令提示符并重新打开它即可解决问题。 - Chris J
@ChrisJ - 这是因为新的命令提示符将在新会话中启动,因此也会加载更新的环境变量。 - Cyclonecode

19

在命令提示符下运行以下命令,以获取您已安装的Java版本:

set Path="C:\Program Files\Java\jdk1.7.0_09\bin"
或者
set PATH="C:\Program Files\Java\jdk1.7.0_09\bin"

我尝试过这个方法,效果很好。


这并不推荐,因为它会覆盖所有其他的PATH选项。 - OneCricketeer

6

如果 java 命令可用,并且使用 javac 时出现问题。 那么首先检查 jdk 的 bin 目录中是否存在 javac.exe 文件。

如果 javac.exe 文件存在,则将 JAVA_HOME 设置为系统变量。


3

请检查您的环境变量。

在我的情况下,我在系统变量用户帐户变量中都设置了JAVA_HOME,并且后者设置为错误版本的Java。路径变量也存在同样的问题。

删除用户帐户中的JAVA_HOME变量并从路径变量中删除错误路径后,它正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接