Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:\ProgramData\Oracle\Java\javapath\Java.exe使用哪个JRE?_Java - Fatal编程技术网

C:\ProgramData\Oracle\Java\javapath\Java.exe使用哪个JRE?

C:\ProgramData\Oracle\Java\javapath\Java.exe使用哪个JRE?,java,Java,我试图找出java使用哪个环境变量来查找/检测C:\ProgramData\Oracle\java\javapath\java.exe所使用的JRE 根据Oracle的设计,我在C:\ProgramData\Oracle\Java\javapath\中仅有的文件是 java.exe javaw.exe javaws.exe 如果我将我的JAVA\u HOME设置为空或某个随机文件夹,使用JAVA.exe运行应用程序仍然有效。因此,我只能假设它没有使用JAVA\u HOME值。那么它是如何找到

我试图找出java使用哪个环境变量来查找/检测
C:\ProgramData\Oracle\java\javapath\java.exe所使用的JRE

根据Oracle的设计,我在
C:\ProgramData\Oracle\Java\javapath\
中仅有的文件是

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

如果我将我的
JAVA\u HOME
设置为空或某个随机文件夹,使用
JAVA.exe运行应用程序仍然有效。因此,我只能假设它没有使用
JAVA\u HOME
值。那么它是如何找到JRE文件夹的呢?它是否默认为特定的内容?我也没有
JRE_HOME
var集

这会给你一个想法:

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]
现在,有趣的是,javapath\u target\u中的
java.exe
等。。。文件夹不是符号链接。这些文件使用以下注册表位置查找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"
这些“新的”JDK 8/64位行为非常混乱,我猜不出为什么我的应用程序不会启动,因为我有JDK(带有专用JRE)和每个路径变量设置,但仍然没有启动。 过了一段时间,我单独安装了JRE8,它运行正常。首先,regedit-key只由公共JRE编写。。。。嗯

然后我想知道应用程序使用的是哪种运行时,我重命名了所有java*.exe,但它仍然有效64位。我重命名了所有新的regedit键。它仍然有效

故事结束:对于Windows 64,regedit键处于
HKEY\u LOCAL\u MACHINE\SOFTWARE\JavaSoft
(32位)和

HKEY\u LOCAL\u MACHINE\SOFTWARE\WOW6432Node\JavaSoft
(64位)

我的应用程序之所以有效是因为

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\1.8\RuntimeLib\ 
指向使用符号链接的jvm.dll。我需要一杯啤酒,我想要另一份工作:-)

这里有一个很好的链接,它解释了Regedit键和Java用来创建的不同“发现方法” 查找最新安装的版本:

尽管如此,JDK8的SYSLink-Change似乎是在JRE8u171之前引入的未记录的更改

我的系统链接路径是
C:\ProgramFiles(x86)\Common Files\Oracle\Java
,实际上是到子目录的连接。 JDK8安装程序将java*.exe文件复制到Windows\System32\btw中

更多资讯:

  • -在Windows 10上,
    C:\ProgramData\Oracle\Java\javapath
    的意义是什么

对不起我的咆哮,我现在很沮丧。我希望它能帮助其他人。

使用findstr尝试java-verbose 例如:

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:\>
使用/s尝试注册查询 例如:

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:\>
尝试使用java获取命令 注意:如果您只关心版本号,则可能需要尝试PowerShell的
Get命令

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

你看过PATH环境变量了吗?@OldProgrammer当然。我在这里定义了其他java路径。但是java.exe会使用path env变量来查找它所需的lib吗?我希望它需要JAVA_HOME变量,而不是使用路径变量。通常,我希望该路径用于查找可执行文件。此外,如果我清除PATH var,使其仅定义了C:\ProgramData\Oracle\Java\javapath\defined,Java仍在运行。我相信在PATH变量旁边,system32中的Java.exe使用了regedit查找。这种行为花费了我很多时间…谢谢。它将我指向c:\ProgramFiles(x86)\java文件夹。我仍然不知道它为什么默认在那里,但至少我知道它现在在哪里。实际上WOW6432Node是32位应用程序使用的注册表节点。有趣的是,我尝试通过注册表更改版本,然后获取
错误:注册表项'Software\JavaSoft\Java Runtime Environment'\CurrentVersion'的值为'11.0.5',但需要'1.8'。