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

Eri*_* B. 15 java

我正在尝试找出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设置变量。

acc*_*ted 10

这会给你一个想法:

java -verbose | more
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。它指向c:\ Program Files(x86)\ java文件夹。我仍然不确定我是否理解默认值,但是至少我知道它现在在哪里。 (2认同)

Chr*_*cke 10

带有文件符号链接的常规目录

如果查看其中的文件,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]
Run Code Online (Sandbox Code Playgroud)

内部包含常规文件的目录连接

实际上,使用最新版本(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
Run Code Online (Sandbox Code Playgroud)

现在,有趣的是,java.exejavapath_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"
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,我尝试通过注册表更改版本,然后得到“错误:注册表项 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion' 的值为 '11.0.5',但需要 '1.8'。” (2认同)

Sta*_*uff 7

尝试使用 java -verbose 和 findstr

例子:

C:\>java -verbose 2>nul | findstr /I opened
[Opened C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
Run Code Online (Sandbox Code Playgroud)

(或者尝试一下java -verbose-- 这将输出大量文本。并且 Java 标准 JAR 的路径将被包含多次。)

尝试使用 /s 进行 reg 查询

例子:

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:\>
Run Code Online (Sandbox Code Playgroud)

尝试 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
Run Code Online (Sandbox Code Playgroud)


98p*_*key 6

这些“新的” JDK 8/64位行为是如此令人困惑,我无法猜测为什么我的应用程序无法启动,因为我已经安装了JDK(带有专用JRE)和每个路径变量,但仍然无法启动。一段时间后,我单独安装了JRE8,它开始工作了。首先,regedit-密钥仅由公共JRE编写。

然后,我想知道该应用程序使用了哪个运行时,我将所有java * .exe重命名,但仍能正常工作。它仍然有效...

故事的结尾:在Windows 64中,regedit密钥位于 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft(32bit)和

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft (64位)

而我的应用程式运作正常,因为

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\1.8\RuntimeLib\ 
Run Code Online (Sandbox Code Playgroud)

指向受尊敬的符号链接的jvm.dll。我需要啤酒,我想要另一份工作:-)

这是一个很好的链接,它解释了Regedit-Keys和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中。

更多信息:

很抱歉,我现在很沮丧。我希望它可以帮助其他人。

  • 实际上,“ WOW6432Node **”是32位应用程序使用的注册表节点。 (2认同)