I am experiencing an error while trying to compile Java programs.
I am on Windows (this is a Windows-specific problem) and I have the latest JDK installed.
I have attempted a solution involving the PATH
variable, but the error persists.
Console output:
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.
You mistyped the
set
command – you missed the backslash afterC:
. It should be:Check your environment variables.
In my case I had JAVA_HOME set in the System variables as well as in my User Account variables and the latter was set to a wrong version of Java. I also had the same problem with the Path variable.
After deleting JAVA_HOME from my User Account variables and removing the wrong path from the Path variable it worked correctly.
Run the following from the command prompt:
set Path="C:\Program Files\Java\jdk1.7.0_09\bin"
orset PATH="C:\Program Files\Java\jdk1.7.0_09\bin"
I have tried this and it works well.
TL;DR
For experienced readers:
C:\Program Files\Java\jdkxxxx\bin\
PATH
. Remove old Java paths.PATH
.JAVA_HOME
.Welcome!
You have encountered one of the most notorious technical issues facing Java beginners: the
'xyz' is not recognized as an internal or external command...
error message.In a nutshell, you have not installed Java correctly. Finalizing the installation of Java on Windows requires some manual steps. You must always perform these steps after installing Java, including after upgrading the JDK.
Environment variables and
PATH
(If you already understand this, feel free to skip the next three sections.)
When you run
javac HelloWorld.java
, cmd must determine wherejavac.exe
is located. This is accomplished withPATH
, an environment variable.An environment variable is a special key-value pair (e.g.
windir=C:\WINDOWS
). Most came with the operating system, and some are required for proper system functioning. A list of them is passed to every program (including cmd) when it starts. On Windows, there are two types: user environment variables and system environment variables.You can see your environment variables like this:
The most important variable is
PATH
. It is a list of paths, separated by;
. When a command is entered into cmd, each directory in the list will be scanned for a matching executable.On my computer,
PATH
is:When you run
javac HelloWorld.java
, cmd, upon realizing thatjavac
is not an internal command, searches the systemPATH
followed by the userPATH
. It mechanically enters every directory in the list, and checks ifjavac.com
,javac.exe
,javac.bat
, etc. is present. When it findsjavac
, it runs it. When it does not, it prints'javac' is not recognized as an internal or external command, operable program or batch file.
You must add the Java executables directory to
PATH
.JDK vs. JRE
(If you already understand this, feel free to skip this section.)
When downloading Java, you are offered a choice between:
java
but notjavac
.java
andjavac
, along with a host of other development tools. The JDK is a superset of the JRE.You must make sure you have installed the JDK. If you have only installed the JRE, you cannot execute
javac
because you do not have an installation of the Java compiler on your hard drive. Check your Windows programs list, and make sure the Java package's name includes the words "Development Kit" in it.Don't use
set
(If you weren't planning to anyway, feel free to skip this section.)
Several other answers recommend executing some variation of:
Do not do that. There are several major problems with that command:
PATH
and replaces it with the Java path. After executing this command, you might find various other commands not working.C:\Program Files\Java\jdk1.7.0_09\bin
– you almost definitely have a newer version of the JDK, which would have a different path.PATH
only applies to the current cmd session. You will have to reenter theset
command every time you open Command Prompt.Points #1 and #2 can be solved with this slightly better version:
But it is just a bad idea in general.
Find the Java path
The right way begins with finding where you have installed Java. This depends on how you have installed Java.
Exe installer
You have installed Java by running a setup program. Oracle's installer places versions of Java under
C:\Program Files\Java\
(orC:\Program Files (x86)\Java\
). With File Explorer or Command Prompt, navigate to that directory.Each subfolder represents a version of Java. If there is only one, you have found it. Otherwise, choose the one that looks like the newer version. Make sure the folder name begins with
jdk
(as opposed tojre
). Enter the directory.Then enter the
bin
directory of that.You are now in the correct directory. Copy the path. If in File Explorer, click the address bar. If in Command Prompt, copy the prompt.
The resulting Java path should be in the form of (without quotes):
Zip file
You have downloaded a .zip containing the JDK. Extract it to some random place where it won't get in your way;
C:\Java\
is an acceptable choice.Then locate the
bin
folder somewhere within it.You are now in the correct directory. Copy its path. This is the Java path.
Remember to never move the folder, as that would invalidate the path.
Open the settings dialog
That is the dialog to edit
PATH
. There are numerous ways to get to that dialog, depending on your Windows version, UI settings, and how messed up your system configuration is.Try some of these:
control sysdm.cpl,,3
SystemPropertiesAdvanced.exe
» Environment VariablesControl Panel\System and Security\System
» Advanced System Settings (far left, in sidebar) » Environment VariablesAny of these should take you to the right settings dialog.
If you are on Windows 10, Microsoft has blessed you with a fancy new UI to edit
PATH
. Otherwise, you will seePATH
in its full semicolon-encrusted glory, squeezed into a single-line textbox. Do your best to make the necessary edits without breaking your system.Clean
PATH
Look at
PATH
. You almost definitely have twoPATH
variables (because of user vs. system environment variables). You need to look at both of them.Check for other Java paths and remove them. Their existence can cause all sorts of conflicts. (For instance, if you have JRE 8 and JDK 11 in
PATH
, in that order, thenjavac
will invoke the Java 11 compiler, which will create version 55.class
files, butjava
will invoke the Java 8 JVM, which only supports up to version 52, and you will experience unsupported version errors and not be able to compile and run any programs.) Sidestep these problems by making sure you only have one Java path inPATH
. And while you're at it, you may as well uninstall old Java versions, too. And remember that you don't need to have both a JDK and a JRE.If you have
C:\ProgramData\Oracle\Java\javapath
, remove that as well. Oracle intended to solve the problem of Java paths breaking after upgrades by creating a symbolic link that would always point to the latest Java installation. Unfortunately, it often ends up pointing to the wrong location or simply not working. It is better to remove this entry and manually manage the Java path.Now is also a good opportunity to perform general housekeeping on
PATH
. If you have paths relating to software no longer installed on your PC, you can remove them. You can also shuffle the order of paths around (if you care about things like that).Add to
PATH
Now take the Java path you found three steps ago, and place it in the system
PATH
.It shouldn't matter where in the list your new path goes; placing it at the end is a fine choice.
If you are using the pre-Windows 10 UI, make sure you have placed the semicolons correctly. There should be exactly one separating every path in the list.
There really isn't much else to say here. Simply add the path to
PATH
and click OK.Set
JAVA_HOME
While you're at it, you may as well set
JAVA_HOME
as well. This is another environment variable that should also contain the Java path. Many Java and non-Java programs, including the popular Java build system Gradle, will throw errors if it is not correctly set.If
JAVA_HOME
does not exist, create it as a new system environment variable. Set it to the same Java path you added toPATH
.Remember to edit
JAVA_HOME
after upgrading Java, too.Close and re-open Command Prompt
Though you have modified
PATH
, all running programs, including cmd, only see the oldPATH
. This is because the list of all environment variables is only copied into a program when it begins executing; thereafter, it only consults the cached copy.There is no good way to refresh cmd's environment variables, so simply close Command Prompt and open it again. If you are using an IDE, close and re-open it too.
See also
try this.. I had it too but now it solved in XP..
If java command is working and getting problem with javac. then first check in jdk's bin directory javac.exe file is there or not. If javac.exe file is exist then set
JAVA_HOME
as System variable.