Какая JRE использует C:\ProgramData\Oracle\Java\javapath\java.exe?

Я пытаюсь выяснить, какую переменную среды java использует для поиска/обнаружения JRE, используемого C:\ProgramData\Oracle\Java\javapath\java.exe.

Согласно проекту Oracle, единственные файлы, которые у меня есть в C:\ProgramData\Oracle\Java\javapath\, это

  • java.exe
  • javaw.exe
  • javaws.exe

Если я установлю свой JAVA_HOME пустым или на какую-нибудь случайную папку, запуск приложения с java.exe все еще будет работать. Поэтому я могу только предположить, что он не использует значение JAVA_HOME. Так как же найти папку JRE? По умолчанию это что-то конкретное? У меня нет JRE_HOME var set либо.

Ответ 1

Это даст вам представление:

java -verbose | more

Ответ 2

Обычный каталог с файловыми ссылками внутри

Если вы посмотрите на файлы в C:\ProgramData\Oracle\Java\javapath\, то увидите, что они на самом деле являются символическими ссылками на определенные двоичные файлы Java.

2015-11-13  06:11 PM    <SYMLINK>      java.exe [C:\Program Files\Java\jre1.8.0_65\bin\java.exe]
2015-11-13  06:11 PM    <SYMLINK>      javaw.exe [C:\Program Files\Java\jre1.8.0_65\bin\javaw.exe]
2015-11-13  06:11 PM    <SYMLINK>      javaws.exe [C:\Program Files\Java\jre1.8.0_65\bin\javaws.exe]

Соединение каталогов с обычными файлами внутри

Использование последней (64! Битной) установки Java 8 фактически предопределяет системный путь в другом месте: c:\Program Files (x86)\Common Files\Oracle\Java\javapath. На этот раз сам javapath является перекрестком:

2018-07-21  05:59 PM    <JUNCTION>     javapath [C:\Program Files (x86)\Common Files\Oracle\Java\javapath_target_172906453]
2018-07-21  05:59 PM    <DIR>          javapath_target_172906453

А теперь, что интересно, java.exe и т.д. в папке javapath_target _... не являются символическими ссылками. Эти файлы находят версии JRE и JDK, используя это местоположение реестра:

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment]
"CurrentVersion"="1.8"

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8]
"JavaHome"="C:\\Program Files\\Java\\jre1.8.0_65"

Ответ 3

Это "новое" 8/64-битное поведение JDK настолько запутано, что я не мог догадаться, почему мое приложение не запустилось, потому что у меня был JDK (с частным JRE) и все настройки переменных пути, но по-прежнему нет запуска. Через некоторое время я установил JRE8 один, и это сработало. Во-первых, ключи regedit - пишутся только публичной JRE.... Хорошо.

Затем я захотел узнать, какое время выполнения приложение использовало, я переименовал все java *.exe, но он все еще работал 64-битный, я переименовал все новые ключи regedit. Это все еще работает...

Конец истории: с Windows 64 ключи regedit находятся в HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft (32 бита) и

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft (64 бита)

и мое приложение работало, потому что

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\1.8\RuntimeLib\ 

указал на jvm.dll, который почитал символическую ссылку. Мне нужно пиво, я хочу другую работу :-)

Вот хорошая ссылка, которая объясняет ключи Regedit и различные "методы обнаружения", которые Java использует для найти последнюю установленную версию:

http://mindprod.com/jgloss/registry.html

Тем не менее, SYSLink - изменение с JDK8 кажется недокументированным изменением, которое было введено до JRE8u171.

Мой путь sysLink был C:\Program Files (x86)\Common Files\Oracle\Java с, фактически был переходом к подкаталогу. А установщик JDK8 копирует файлы java *.exe в Windows\System32\btw.

Больше информации:

Извините за мою напыщенную речь, я так расстроен прямо сейчас. Я надеюсь, что это помогает кому-то еще.

Ответ 4

Попробуйте java -verbose с помощью findstr

Пример:

C:\>java -verbose 2>nul | findstr /I opened
[Opened C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]

Попробуйте reg запрос с /s

Пример:

C:\>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment" /s

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
    CurrentVersion    REG_SZ    1.8
    BrowserJavaVersion    REG_SZ    11.201.2

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8
    RuntimeLib    REG_SZ    C:\Program Files\Java\jre1.8.0_201\bin\server\jvm.dll
    JavaHome    REG_SZ    C:\Program Files\Java\jre1.8.0_201
    MicroVersion    REG_SZ    0

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8.0_201
    JavaHome    REG_SZ    C:\Program Files\Java\jre1.8.0_201
    MicroVersion    REG_SZ    0
    RuntimeLib    REG_SZ    C:\Program Files\Java\jre1.8.0_201\bin\server\jvm.dll

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8.0_201\MSI
    INSTALLDIR    REG_SZ    C:\Program Files\Java\jre1.8.0_201\
    JU    REG_SZ
    OEMUPDATE    REG_SZ
    FROMVERSION    REG_SZ    NA
    FROMVERSIONFULL    REG_SZ
    PRODUCTVERSION    REG_SZ    8.0.2010.9
    EULA    REG_SZ
    JAVAUPDATE    REG_SZ    1
    AUTOUPDATECHECK    REG_SZ    1
    AUTOUPDATEDELAY    REG_SZ
    FullVersion    REG_SZ    1.8.0_201-b09


C:\>

Попробуйте Get-Command Java

Примечание. Если вам важен только номер версии, попробуйте PowerShell Get-Command:

PS C:\> Get-Command java | ft -AutoSize

CommandType Name     Version   Source
----------- ----     -------   ------
Application java.exe 8.0.201.9 C:\Program Files (x86)\Common 
Files\Oracle\Java\javapath\java.exe