尝试编译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.
TL; DR
对于有经验的读者:
你遇到了Java初学者面临的最臭名昭著的技术问题之一:'xyz' is not recognized as an internal or external command…错误消息。
'xyz' is not recognized as an internal or external command
简而言之,你尚未正确安装Java。完成Windows上Java的安装需要一些手动步骤。你必须在安装Java之后(包括升级JDK之后)始终执行这些步骤。
环境变量和 PATH
(如果你已经了解这一点,请随时跳过接下来的三个部分。)
运行时javac HelloWorld.java,cmd必须确定javac.exe位置。这是通过PATH环境变量来完成的。
javac HelloWorld.java
javac.exe
的环境变量是一个特殊的键-值对(例如windir=C:\WINDOWS)。大多数是操作系统附带的,有些是正常运行所必需的。它们的列表在启动时传递给每个程序(包括cmd)。在Windows上,有两种类型:用户环境变量和系统环境变量。
windir=C:\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.javacmd时,当意识到这javac不是内部命令时,将在用户之后搜索系统PATHPATH。它机械地进入列表中的每个目录中,并且如果检查javac.com,javac.exe,javac.bat等的存在。找到时javac,它将运行它。如果没有,则打印'javac' is not recognized as an internal or external command, operable program or batch file.
javac HelloWorld.javacmd
javac.com,javac.exe,javac.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),它同时包含java和javac,与其他开发工具主机一起。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
不要那样做。该命令有几个主要问题:
PATH
C:\Program Files\Java\jdk1.7.0_09\bin
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\)下。使用文件资源管理器或命令提示符,导航到该目录。
C:\Program Files\Java\(或C:\Program Files (x86)\Java\)
每个子文件夹代表一个Java版本。如果只有一个,那么你已找到它。否则,请选择看起来较新的版本。确保文件夹名称以开头jdk(而不是jre)。输入目录。
然后输入该bin目录。
你现在位于正确的目录中。复制路径。如果在文件资源管理器中,请单击地址栏。如果在命令提示符下,请复制提示。
生成的Java路径应采用(不带引号)的形式:
C:\Program Files\Java\jdkxxxx\bin\
压缩文件 你已经下载了包含JDK的.zip。将其提取到不会妨碍你的位置;C:\Java\是可以接受的选择。
C:\Java\
然后在其中找到该bin文件夹。
你现在位于正确的目录中。复制其路径。这是Java路径。
切记不要移动文件夹,因为那样会使路径无效。
打开设置对话框
那是要编辑的对话框PATH。进入该对话框的方式有很多,具体取决于你的Windows版本,UI设置以及系统配置的混乱程度。
尝试其中的一些:
+ R» control sysdm.cpl,,3
Win + R» SystemPropertiesAdvanced.exe»
这些中的任何一个都应带你到正确的设置对话框。
如果你使用的是Windows 10,Microsoft会为你提供一个精美的新UI进行编辑,为你祝福PATH。否则,你会看到PATH它充满了分号,充满了荣耀,并挤进了单行文本框中。尽最大努力进行必要的编辑,而不会破坏系统。
Clean PATH
看看PATH。你几乎肯定有两个PATH变量(因为用户环境变量与系统环境变量有关)。你需要同时查看它们。
检查其他Java路径并将其删除。它们的存在会引起各种冲突。(例如,如果你PATH按该顺序在JRE 8和JDK 11中,javac则将调用Java 11编译器,该Java 11编译器将创建55版.class文件,但是java将调用Java 8 JVM,该Java 8 JVM仅支持最高52版,并且你将遇到不受支持的版本错误,并且无法编译和运行任何程序。)通过确保在中只有一个Java路径来回避这些问题PATH。在使用它的同时,你也可以卸载旧的Java版本。请记住,你不需要同时拥有JDK和JRE。
如果有C:\ProgramData\Oracle\Java\javapath,也将其删除。Oracle旨在通过创建始终指向最新Java安装的符号链接来解决升级后Java路径中断的问题。不幸的是,它常常最终指向错误的位置或根本不起作用。最好删除此条目并手动管理Java路径。
现在也是进行一般家政服务的好机会PATH。如果你的PC上不再有与软件相关的路径,则可以将其删除。你也可以调整周围路径的顺序(如果你关心类似的事情)。
Add to PATH
现在,采用你在三个步骤之前找到的Java路径,并将其放置在系统中PATH。
你的新路径在列表中的位置并不重要;将其放在最后是一个不错的选择。
如果你使用的是Windows 10之前的用户界面,请确保已正确放置分号。列表中的每个路径都应该有一个正确的分隔符。
这里真的没有什么要说的了。只需添加路径PATH并单击“确定”即可。
JAVA_HOME
当你使用它时,你也可以进行设置JAVA_HOME。这是另一个环境变量,也应包含Java路径。如果未正确设置,许多Java和非Java程序(包括流行的Java构建系统Gradle)都会引发错误。
如果JAVA_HOME不存在,请将其创建为新的系统环境变量。将其设置为你添加到的相同Java路径PATH。
记住,JAVA_HOME升级Java后也要进行编辑。
关闭并重新打开命令提示符
尽管你已进行了修改PATH,但所有正在运行的程序(包括cmd)都只能看到旧版本PATH。这是因为所有环境变量的列表仅在开始执行时才复制到程序中。此后,它仅查询缓存的副本。
没有刷新cmd的环境变量的好方法,因此只需关闭命令提示符并再次打开即可。如果你使用的是IDE,也请关闭并重新打开它。