Ответ 1
Это даст вам представление:
java -verbose | more
Я пытаюсь выяснить, какую переменную среды 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 либо.
Это даст вам представление:
java -verbose | more
Если вы посмотрите на файлы в 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"
Это "новое" 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.
Больше информации:
http://makble.com/jdk-8-and-cprogramdataoraclejavajavapath - В чем смысл C:\ProgramData\Oracle\Java\javapath
(в Windows 10)?
https://community.oracle.com/thread/4143254 https://douglascayers.com/2015/05/30/how-to-set-custom-java-path-after-installing-jdk-8/
Извините за мою напыщенную речь, я так расстроен прямо сейчас. Я надеюсь, что это помогает кому-то еще.
Пример:
C:\>java -verbose 2>nul | findstr /I opened
[Opened C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
Пример:
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:\>
Примечание. Если вам важен только номер версии, попробуйте 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