У меня есть java 7
и java 8
, установленные на моей системе Windows под C:\Program Files\Java
В пути среды я указал путь java 7
следующим образом.
%JAVA_HOME%/bin
где JAVA_HOME = C:\Program Files\Java\jdk1.7.0_17
Но когда я набираю javac -version
, он показывает javac 1.7.0_17
, что имеет смысл
но когда я делаю java -version
, он показывает
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)
Любая идея, что может быть проблемой здесь?
Изменить Установленная папка:
И еще одна вещь echo %PATH%
имеет только одно вхождение JDK
, которое для java 7
и не имеет места для JRE
, найденного в нем.
Проблема возникает, скорее всего, потому, что у вас есть JRE
в вашем path
, перед вашим JDK
. Обычно это происходит, когда мы добавляем JDK в path
и не удаляем ранее добавленные JRE. Таким образом, когда вы делаете java
, он указывает на JRE, а когда вы делаете javac
, он указывает на другую версию /JDK (поскольку jre не имеет javac в ней)
Изменить: - Поскольку вы отредактировали свой вопрос и разместили без каких-либо JRE в своем пути, вы можете скопировать ваш %JAVA_HOME%
и вставить его сначала в свою переменную пути (убедитесь, что он до пути system32), я столкнулся с этой проблемой до (при установке android sdk), и это разрешило это.
Также найдено возможное объяснение этого из здесь: -
JRE also puts a java.exe to c:\Windows\System32, that 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.
echo %PATH%
показывает только один случай JDK, который относится к Java 7, и в нем не найдено ни одного случая JRE.
Хорошо, как вы сказали, что у вас нет JRE на вашем пути, я предполагаю, что where java
(если у вас Windows 7) даст вам C:\Windows\System32\java.exe
.
java
работаетПопробуйте использовать диалог настроек Java с панели управления, чтобы изменить версию Java System Version, которая в настоящее время активна. Это должно изменить версию java -version
. Если это не сработает, вам, вероятно, потребуется переустановить версию Java, для которой вы хотите запустить команду java
, указать путь явно, написать свою собственную оболочку (которая работает, если вы находитесь в том же каталоге, что и обертка) или поместите путь JRE до C:\Windows\System32\
на ваш путь (не знаю, действительно ли последний вариант действительно хорош).
Обертка может выглядеть так:
@"C:\Program Files\Java\jre7\bin\java.exe" %*
и вы можете назвать его java.bat
(где он будет работать, если вы находитесь в том же каталоге или поместите его в PATH
до C:\Windows\System32\java.exe
или вы можете назвать его java7.bat
и поместить его в любом месте вашего пути чтобы иметь возможность запуска Java JRE JRE, если вы этого хотите.
Обертка также является хорошим вариантом, если вы хотите изменить JAVA_HOME
при запуске.
javac
работаетЕсли вы хотите запустить другой javac
хит Windows + Pause
и откройте системный диалог, чтобы изменить PATH
, поэтому он содержит путь к вашему JDK 8 вместо вашего JDK 7. Вам нужно будет перезапустить команду строка для показа изменений.
Чтобы решить такую проблему, я всегда верю в команду whereis, Чтобы сделать то же самое в windows, загрузите whereis.exe, затем установите путь и выполните команду
whereis java.exe
whereis javac.exe
Вы легко найдете точный путь, из которого вызывается java в среде, а также о javac.
where java
...
Перейдите в Переменные среды на вашем компьютере с Windows. В пользовательских переменных: Убедитесь, что для вашей пользовательской переменной "JAVA_HOME" установлено значение "C:\Program Files\Java\jdk-xxxx\bin", где "jdk-xxx" - это версия вашего jdk.
В системной переменной: - Добавьте то же значение "C:\Program Files\Java\jdk-xxxx\bin" в переменную "Path". не забудьте переместить добавленную стоимость поверх всех значений.
Теперь попробуйте запустить Java -version и Javac -version. работал на меня. :) Здесь я связал свой скриншот
В моем случае (перемещение jdk8 → jdk9 → jdk11) у меня был мусор, оставленный jdk8 в PATH (до JAVA_HOME: "C:\path\java11")
так что я просто удалить C:\ProgramData\Oracle\Java\javapath
от системных переменных
Да, это правда, что для того, чтобы иметь дело с несовпадающими версиями, нам нужно изменить переменную PATH, а команда where
(по крайней мере, в Windows) очень удобна для определения, какая программа выбирается первой. Однако есть и поворот: когда вы смотрите на содержимое yout PATH var после запуска, например,
echo %path% > path.txt
Вы должны знать о том факте, что PATH фактически состоит из ДВУХ разделов: один из них - системный PATH, а другой - текущий пользовательский PATH, и это системный путь, который оценивается первым, но печатается последним. Поэтому простое размещение пути к вашему, скажем, новому JDK перед всем будет бесполезным, если в System PATH есть место с более старой версией.
Эта конкретная проблема особенно распространена, когда у вас есть записи, такие как
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\ProgramData\Oracle\Java\javapath
в вашей Системе PATH. Просто переместите их в конец раздела PATH текущего пользователя, чтобы сделать эти записи последними в очереди поиска.
Я думаю, когда вы пишете javac
, он получает значение от jre7
, которое в настоящее время используется вами для целей разработки, и когда вы пишете java version
, он получает значение version
из jre8
, который в настоящее время используется установленными приложениями в вашей системе, потому что ваш JRE
системы упоминается перед jre7
, который вы используете для разработки
После входа в программу или выполнения системного вызова система сначала ищет в текущем каталоге, а затем в PATH
, проверяя каждый каталог слева направо в исполняемом файле, соответствующем команде. Когда система находит исполняемый файл, запускает его (остановка поиска).
У вас есть предварительно установленная система JRE в переменной среды PATH
до JRE, которая вам нужна.
echo %PATH%
папку JRE Java 8 перед папкой JDK Java 7