我在试图编译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.
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 后,你必须始终执行这些步骤。
(如果你已经了解了这些,请随意跳过后面三节。)
当你运行javac HelloWorld.java
时,cmd必须确定javac.exe
的位置。这是通过PATH',一个环境变量来实现的。 [*环境变量*](https://en.wikipedia.org/wiki/Environment_variable)是一个特殊的键值对(例如:
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.com
, javac.exe
, javac.bat
, 等等 。当它找到javac
时,它就运行它。当它没有找到时,它会打印出"'javac'未被识别为内部或外部命令、可操作程序或批处理文件"。
你必须将Java可执行文件目录添加到PATH
中。
(如果你已经了解了这些,可以跳过这一节。)。 在下载Java时,你可以选择。
java
但不包括javac
。java
和javac
,以及一系列其他开发工具。JDK是JRE的一个超集。
你必须确保你已经安装了JDK。如果你只安装了JRE,你不能执行javac
,因为你的硬盘上没有安装Java编译器。检查你的Windows程序列表,并确保Java包的名称中包括"开发工具包"字样。(如果你不打算这样做,可以跳过这一节。)。 其他几个答案建议执行一些不同的操作。
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.3. 新的PATH
只适用于当前的cmd会话。每次打开Command Prompt时,你都必须重新输入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。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设置以及你的系统配置有多混乱。
试试其中的一些。
control sysdm.cpl,,3
。SystemPropertiesAdvanced.exe
» 环境变量控制面板/系统和安全/系统
» 高级系统设置(最左边,在侧边栏) » 环境变量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
进行一般管理的好机会。如果你的电脑上有与不再安装的软件有关的路径,你可以删除它们。你也可以改变路径的顺序(如果你关心这样的事情)。
PATH
中现在把你三步前找到的Java路径放到系统的PATH
中。
你的新路径在列表的什么位置并不重要,把它放在最后是一个不错的选择。
如果你使用的是Windows 10之前的用户界面,请确保你正确放置了分号。列表中的每个路径都应该有一个分号。
这里真的没有什么别的可说的。只需将路径添加到PATH
,然后点击确定。
既然如此,你也可以设置JAVA_HOME'。这是另一个环境变量,也应该包含Java路径。许多Java和非Java程序,包括流行的Java构建系统[Gradle](https://gradle.org/),如果它没有被正确设置,就会产生错误。 如果
JAVA_HOME不存在,请将其创建为一个新的系统环境变量。把它设置为与你添加到
PATH中的Java路径相同。 记住在升级Java后也要编辑
JAVA_HOME`。
尽管你已经修改了PATH
,但所有正在运行的程序,包括 cmd,都只能看到旧的PATH
。这是因为所有环境变量的列表只有在程序开始执行时才会被复制到程序中;此后,它只会查阅缓存的副本。
没有好的方法来刷新cmd'的环境变量,所以只需关闭Command Prompt,然后再次打开它。如果你使用的是IDE,也要关闭并重新打开它。
如果java命令正在工作,而javac出现了问题,那么首先检查jdk'的bin目录中javac.exe文件是否存在。
如果javac.exe文件存在,则将JAVA_HOME
设为系统变量。