35

I have java 7 and java 8 both installed on my windows system under C:\Program Files\Java

In the environment's path I specified the path of java 7 like this.

%JAVA_HOME%/bin where JAVA_HOME = C:\Program Files\Java\jdk1.7.0_17

But when I type javac -version it shows javac 1.7.0_17 which makes sense

but when I do java -version it shows

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

enter image description here

Any idea what may be the problem here?

Edit The installed folder : enter image description here

And one more thing echo %PATH% has only one occurence of JDK that is for java 7 and no occurence for JRE found in it.

SparkOn
  • 8,193
  • 3
  • 23
  • 28

10 Answers10

28

The issue is occuring most probably because you have a JRE in your PATH, before your JDK. This usually happens when we add JDK in the PATH and do not remove previously added JREs. Thus when you do java it points to the JRE and when you do javac it points to the other version/JDK (since the JRE does not have a javac in it)

If you don't have any JREs in your path, then you can copy your %JAVA_HOME% and paste it first in your path variable (make sure its before the system32 path).

A possible reason for why this works is explained in this answer:

JRE also puts a java.exe to c:\Windows\System32, that's how first command is resolved. Second command is resolved by the C:\Program Files\Java\jdk1.7.0_02\bin entry in your PATH variable. If (and when) you are developing from the command prompt, you have to adjust the PATH variable so that C:\Program Files\Java\jdk1.7.0_02\bin is before c:\Windows\System32.

Joachim Sauer
  • 278,207
  • 54
  • 523
  • 586
Mustafa sabir
  • 3,857
  • 1
  • 17
  • 27
  • `echo %PATH%` shows only one occurence of JDK and that is for java 7 and no occurence for JRE found in it. – SparkOn Aug 01 '14 at 06:34
  • Ok so I just found that `c:\Windows\System32\java.exe` date-modified is same as the java 8 installation date so I guess that the java.exe in `c:\Windows\System32` is of java8 how to resolve this problem? – SparkOn Aug 01 '14 at 07:02
  • Yes, which i guess confirms that its taking java.exe of java 8 from system32, I have written in my answer, `You can copy your %JAVA_HOME% and paste it first in your path variable (make sure its before system32 path)` , this way it will get both jdk and jre of java 7 before system32 version that is of java 8 – Mustafa sabir Aug 01 '14 at 07:34
  • +1 not an ideal solution though but indeed thanks for the help :) – SparkOn Aug 01 '14 at 07:45
  • Be notice USER path will append to SYSTEM path. However the `C:\Windows\System32` locates in SYSTEM path, you have to add `%JAVA_HOME%\bin` into it which will pollute my SYSTEM path. GUI installer sucks. – NanoNova Mar 29 '21 at 08:13
9

Go to Environment Variables in your windows machine. In User Variables : Make sure to set - Your user variable "JAVA_HOME" value to "C:\Program Files\Java\jdk-xxxx\bin" where "jdk-xxx" is the version of your jdk.

In System Variable : - Add same "C:\Program Files\Java\jdk-xxxx\bin" value to "Path" variable. make sure to move the added value on top of all values.

Now try running java -version and javac -version. worked for me. :) Here i've linked my screenshot

6

Ok, as you said that you have no JRE on your path, I assume that where java (if you have Windows 7) will give you C:\Windows\System32\java.exe.

Changing the java running

Try using the Java-Settings Dialog from the control panel to change the Java System Version, which is currently active. This should change the version java -version is returning. If this does not work, you will probably need to reinstall the Java version of which you want to run the java command, specify the path explicitly, write you own wrapper (which works if you are in the same directory as the wrapper) or place the JRE path before C:\Windows\System32\ onto your path (don't know if last option really is a good one).

A wrapper could look just like this:

@"C:\Program Files\Java\jre7\bin\java.exe" %*

and you can either name it java.bat (where it will work if you are in the same directory or put it in PATH before C:\Windows\System32\java.exe or you could name it java7.bat and put it anywhere on you path to be able to run the Java 7 JRE if you desire to do so.

A wrapper is also a good option if you want to change the JAVA_HOME when running.

Changing the javac running

If you want to run a different javac hit Windows + Pause and open the system dialog to change the PATH so it contains the path to your JDK 8 instead of your JDK 7. You will need to restart your command line for changes to show.

Community
  • 1
  • 1
TheConstructor
  • 4,045
  • 1
  • 28
  • 48
  • I just found that c:\Windows\System32\java.exe date-modified is same as the java 8 installation date so I guess that the java.exe in c:\Windows\System32 is of java8 how to resolve this problem without tempering the path? – SparkOn Aug 01 '14 at 07:03
  • @M.Sharma Second paragraph of my answer. Guess reinstalling the JRE 7 could be the best option. For me there is now way to change the System JRe through the Java-settings-panel also I think that this was once possible. – TheConstructor Aug 01 '14 at 07:05
  • 1
    java path sometimes really can be a pain in the ass – SparkOn Aug 01 '14 at 07:14
  • So that means next time if I uninstall and reinstall java 8 again I'll face the same problem unless I keep my desired path before `c:\Windows\System32` – SparkOn Aug 01 '14 at 07:17
  • @M.Sharma that would probably be the case. Maybe you really should consider using full path or a wrapper. – TheConstructor Aug 01 '14 at 07:24
3

To resolve such kind of environment issue I always believe on command whereis, To do the same in windows download whereis.exe then set in path and execute the command

whereis java.exe

whereis javac.exe

You will easily find the exact path from which location java is being called in environment as well about javac.

prashant thakre
  • 4,314
  • 2
  • 21
  • 36
  • Yes but in other OS version its not there so those developers can use it easily. – prashant thakre Aug 01 '14 at 06:55
  • Where you could also try [`for %i in (java.exe) do @echo %~$PATH:i`](http://stackoverflow.com/a/304441/1266906) which is probably not as fancy, but does not require you to add new programs to your system. – TheConstructor Aug 01 '14 at 06:59
3

My case (moving jdk8 -> jdk9 -> jdk11) I had a garbage left by jdk8 in PATH (before JAVA_HOME:"C:\path\java11")

so I just remove C:\ProgramData\Oracle\Java\javapath_jdk8 from system variables

// or place it below javapath_jdk11

bortunac
  • 3,930
  • 1
  • 26
  • 19
0

Yes, it is true that in order to deal with mismatching versions we need to modify the PATH variable, and the where command (at least, in Windows) is very handy in finding out which program gets picked first. There's, however, a twist: when you look at the contents of yout PATH var after running, for example,

echo %path% > path.txt

you should be aware of the fact that PATH is actually composed of TWO sections: one is System PATH and the other is Current User PATH, and it is System Path that gets evaluated first but printed last. So simply placing a path to your, say, brand-new JDK in front of everything will be useless as long as there's another place with older version somewhere in the System PATH.

This particular problem is especially common when you have entries such as

C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\ProgramData\Oracle\Java\javapath

in your System PATH. Simply move them to the tail of your Current User PATH section to make these entries the last ones within the search queue.

Igor Soudakevitch
  • 621
  • 10
  • 19
0

Check your JAVA_HOME variable under environment variables in Windows machine. Make sure It is pointing to the version that you want. Next check java jdk path added into your "path" environment variable. Make sure It is the version that you want, Otherwise change this to your JDK version path and then move this to the top of the list of values in path variable. This should mark your desired version as the first choice and all issues will be resolved. I did so, and everything is good.

Jewel Jose
  • 61
  • 1
  • 6
0

Please check that you have replaced "C:\ProgramData\Oracle\Java\javapath;" with %JAVA_HOME%/bin in the PATH variable. This did the trick for me.

Terry
  • 33
  • 5
0

FOR LINUX USERS

if java and javac are showing different versions, then you can easily set them to the correct or same versions

step 1

sudo update-alternatives --config java

output :

    Selection    Path                                          Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/javac   1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/javac   1111      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-amd64/bin/javac    1081      manual mode

this will show the following results, start(*) indicates the javac version that your system is using. You can change it by selecting your required version.

step 2

sudo update-alternatives --config java

output :

      Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

Now again you can select the version you want to run for java.

This way you can ensure that java and javac are having the same versions.

vishwampandya
  • 565
  • 3
  • 10
-2

I guess when you are writing javac, it is getting the value from jre7 which is currently being used by you for development purposes and when you write java version, it is getting the value of the version from the jre8 which is currently being used by the installed applications on your system because your JRE of the system is mentioned before the jre7 which you are using for development

nobalG
  • 4,798
  • 3
  • 29
  • 63