2015-02-26 4 views
2

В чем разница между java -version и java -fullversion?java -version vs java -fullversion

Эти два устройства не отображаются на моей машине.

C:\Users\kmort>java -fullversion 
    java full version "1.8.0_20-b26" 

C:\Users\kmort>java -version 
    java version "1.8.0_25" 
    Java(TM) SE Runtime Environment (build 1.8.0_25-b18) 
    Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) 

This link (at the bottom), кажется, указывает, что fullversion просто включает номер сборки. Если это правда, что мне в итоге дать другой ответ, когда я запускаю два?

Отметьте, что this documentation пренебрегает ссылкой на fullversion.

Я бегу на 64-битной Windows 7. Если это помогает, вот скриншот установок JDK и JRE, которые у меня есть на моей машине.

enter image description here

Update


Когда я бегу where команду Window, я получаю следующее:

C:\Users\kmort>where java 
C:\Windows\System32\java.exe 
C:\ProgramData\Oracle\Java\javapath\java.exe 
C:\Program Files\Java\jdk1.8.0_25\bin\java.exe 

Проблема заключается с java.exe расположенной в System32. Если я переименую это в нечто другое, все будет работать так, как ожидалось. И один Oracle - это просто символические ссылки на последний.

Итак, вопрос в том, почему это происходит с java.exe в моей папке System32? (Мой эндшпиль будет удалить java.exe из папки System32, но я хотел бы понять, что происходит в первую очередь.)

Update 2


Использование Process Monitor, можно видеть, что, когда я бегу либо команда на нарушение C:\Windows\System32\java.exe это исполняемый файл, который выполняется (см. снимок экрана, вызывающий LoadImage на C:\Windows\System32\java.exe). Есть также несколько ссылок на C:\Windows\SysWOW64\java.exe в обоих из них. Я не знаю, почему.

enter image description here

Также обратите внимание, что кажется, мой реестр является правильным. Текущая версия - 1,8. enter image description here

Еще одно примечание: отметка времени на C:\Windows\System32\java.exe в тот день, когда я знаю, что я установил JRE.

+0

Мои первоначальные мысли состоят в том, что эта установка Java неверна. Моя вторая, хотя, возможно, что java.exe достаточно умен, чтобы просто проверить реестр Windows вместо «самого себя», и он сообщает, что есть. Проверьте свои ключи JavaSoft, чтобы узнать, какие установленные 64-разрядные JRE находятся в этой системе. И я просто посмотрел на ваше сообщение более внимательно и вижу, что у вас заканчивается System32, хотя он сообщает 64-битную виртуальную машину. Убедитесь, что это тот, который вы не используете. – jdv

+0

@jdv Я просмотрел реестр и вставил снимок экрана выше. Мне кажется, все в порядке. Я что-то упускаю? И System32 - это тот, который он запускает. Я собираюсь удалить его, когда я понимаю, почему номера версий, которые этот твари представляет, различны. – kmort

+0

спасибо за это. Это было наверняка истинное предположение о путях, но, по крайней мере, мы это исключили. Если вы получаете те же результаты, что и java с полным именем пути для обоих вызовов, у меня нет разумных объяснений. – jdv

ответ

1

После долгих и обратно, это выглядит это побочный эффект от установки «обновления» Java, не обновляющей исполняемые файлы Java в каталогах System.

Когда-то на этот аппарат было установлено 1.8.0_20-b26, и он добросовестно помещал полный JAVA_HOME, записи реестра для этой версии, обновлял последнюю виртуальную машину в реестре, а также помещал/special/java.exe в% WinSysDir%

в какой-то момент JVM была обновлена, вероятно, через инструмент программы обновления Java, и, вероятно, не с полной установщиком (ОП может подтвердить.)

Это создает новый JAVA_HOME, обновил реестр и, возможно, даже удалил старую установку _20. Но вот кикер: он не удалял java.exe в% WinSysDir%

@kmort выполнил строки POSIX на исполняемом файле и увидел, что «1.8.0_20-b26» был действительно похоронен в этом старом исполняемом файле.

Итак, что происходит с вариантом -version, он проверит реестр для последней JVM и вызовет это с помощью опции (или просто вернет FullVersion из реестра - мы не знаем, пока мы отслеживать системные вызовы) [Кажется, на самом деле вызывается исполняемый файл --jdv]. Но для -fullversion он просто вернул бы статическую строку внутри исполняемого файла!

Я подозреваю, что тот факт, что -версия может принимать optarg, означает, что обработка этих параметров полностью различна.

Решение заключается в следующем:

  1. Просто удалите java.exe в% WinSysDir%

  2. жить с этим, потому что это, вероятно, безвредны (если обработка -версия не фактически вызывая другую JVM, и в этом случае все ставки отключены)

  3. Переустановите Java 8 с нуля, используя последнюю версию MSI от Oracle ,

(3) должен заменить java.exe в% WinSysDir% (и системы java.exe WOW64). (1), вероятно, полностью прекрасен. (2), вероятно, является ошибкой, если -version приводит к тому, что java.exe блуждает и вызывает реальную JRE, которая не является последней.

+0

Спасибо jdv. Временная метка в файле 'C: \ Windows \ System32 \ java.exe' находится в тот день, когда я знаю, что я установил JRE, поэтому я уверен, что он пришел из Oracle. – kmort

+0

@kmort как об этом. Хорошо знать. Это объясняет вещи немного больше: http://stackoverflow.com/questions/11063831/what-is-the-difference-between-system32-java-exe-and-program-files-java-jdk1 У меня нет системы32 Java по какой-то причине, но я постоянно устанавливаю и обновляю JRE. В какой-то момент он должен быть удален. Интересно, что System32 java IS получен из реестра Windows. Кроме того, опция -version фактически использует опцию SELECT версии. Все это я не знал до сих пор. Так что этот вопрос велик! – jdv

+0

Хм. Поэтому некоторые люди говорят, что 'C: \ Windows \ System32 \ java.exe' является« фиктивным »файлом, который выбирает то, что реестр установил и указывает на это, другие говорят, что это копия фактического Java.exe, который устанавливает JRE , Простая контрольная сумма показывает, что они не совпадают (не соответствует 32 или 64-разрядным версиям). Таким образом, я склоняюсь к «манекену», но это не объясняет, почему я получаю разные результаты для версии, основанной на командной строке, которую я передаю. Я не беспокоюсь о 32 против 64 бит, я беспокоюсь о фактическая разница номеров версий. Спасибо jdv. – kmort

2

Я попытался воспроизвести результаты, и я получил одну и ту же версию java для обеих команд. Поэтому я думаю, что наличие нескольких JRE в вашей папке Java может вызывать несоответствия в ваших результатах.

CMD результаты

enter image description here

Мой JRE в C: \ Program Files (x86) \ Java

enter image description here

+0

Все мои другие машины имеют одинаковые результаты. Только эта победа. Я протестировал вашу теорию, переместив дополнительные пакеты JRE/JDK, но проблема сохранилась. Я думал, возможно, это было из-за 32/64 бит, но проблема все еще сохранялась. Хорошие мысли. Благодарю. :-) – kmort

+0

@kmort Вместо того, чтобы перемещать дополнительные пакеты JRE/JDK, попробуйте удалить их и проверить результаты. Надеюсь, это сработает. – Prudhvi

+0

Я не уверен, как это изменит ситуацию. Мой путь не изменился, и я переместил пакеты JRE/JDK из заданного пути. Если не существует какого-то странного механизма, о котором я не знаю, я бы не смог разрешить мою командную строку для пакетов, которые я переместил. Я что-то упускаю? – kmort