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

新手上路,请多包涵

我在尝试编译 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.

原文由 user987137 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
1 个回答

长话短说

对于有经验的读者:

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

欢迎!

您遇到了 Java 初学者面临的最臭名昭著的技术问题之一: 'xyz' is not recognized as an internal or external command... 错误消息。

简而言之, 您没有正确安装 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

When you run javac HelloWorld.java , cmd, upon realizing that javac is not an internal command , searches the system PATH followed by the user 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 运行时环境(JRE),它包含运行 Java 程序但 编译新程序的必要工具——它包含 java 但不包含 --- javac
  • Java 开发工具包(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 的方式。

安装程序

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

每个子文件夹代表一个 Java 版本。如果只有一个,那么您已经找到了。否则,请选择看起来像较新版本的版本。确保文件夹名称以 jdk jre )。进入目录。

然后进入那个 bin 目录。

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

生成的 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 将调用 Java 8 JVM,它只支持最高版本 52,您将遇到 不受支持的版本错误,并且无法编译和运行任何程序。)通过以下方式回避这些问题确保在 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 不存在,创建一个新的系统环境变量。将其设置为没有 bin/ 目录的 Java 目录的路径,即 C:\Program Files\Java\jdkxxxx\

记得在升级 Java 后编辑 JAVA_HOME

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

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

cmd的环境变量没有什么好的办法刷新,干脆关闭Command Prompt再打开。如果您使用的是 IDE,请关闭并重新打开它。

也可以看看

原文由 carlos c. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题