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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/49540325/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 03:03:32  来源:igfitidea点击:

Which JRE does C:\ProgramData\Oracle\Java\javapath\java.exe use?

java

提问by Eric B.

I'm trying to figure out which environment variable java uses to find/detect the JRE used by C:\ProgramData\Oracle\Java\javapath\java.exe.

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

As per Oracle's design, the only files I have in the C:\ProgramData\Oracle\Java\javapath\are

根据 Oracle 的设计,我拥有的唯一文件C:\ProgramData\Oracle\Java\javapath\

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

If I set my JAVA_HOMEto empty or to some random folder, running an application with java.exestill works. So I can only assume that it isn't using the JAVA_HOMEvalue. So how does it find the JRE folder? Does it default to something specific? I have no JRE_HOMEvar set either.

如果我将 my 设置JAVA_HOME为空或某个随机文件夹,则运行应用程序java.exe仍然有效。所以我只能假设它没有使用该JAVA_HOME值。那么它是如何找到JRE文件夹的呢?它是否默认为特定的东西?我也没有JRE_HOMEvar 集。

采纳答案by access_granted

This will give you an idea:

这会给你一个想法:

java -verbose | more

回答by Chris Becke

Regular Directory with File Symlinks inside

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

If you look at the files in C:\ProgramData\Oracle\Java\javapath\you will see that they are actually symlinks to a specific java binaries.

如果您查看其中的文件,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]

Directory Junction with regular Files inside

带有常规文件的目录连接

Using the latest (64! bit) install of Java 8 actually prepends onto the system path anotherlocation: c:\Program Files (x86)\Common Files\Oracle\Java\javapath. This time, the javapath itself is the junction:

使用最新的(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

And now, interestingly, the java.exeetc. in the javapath_target_... folder are not symlinks. These files find JRE and JDK versions using this registry location:

现在,有趣的是,java.exejavapath_target_... 文件夹中的 etc. 不是符号链接。这些文件使用以下注册表位置查找 JRE 和 JDK 版本:

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

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

回答by 98percentmonkey

These "new" JDK 8 / 64-bit behavior is so obfuscated, I could not guess why my application would not start, because I had the JDK (with the private JRE) and every path variable setup, still no start. After some time I installed JRE8 alone and it worked. Firstly the regedit - keys are only written by the public JRE.... Ok.

这些“新”JDK 8 / 64 位行为如此模糊,我无法猜测为什么我的应用程序无法启动,因为我有 JDK(带有私有 JRE)和每个路径变量设置,仍然没有启动。一段时间后,我单独安装了 JRE8,它工作正常。首先,regedit - 密钥仅由公共 JRE 编写.... 好的。

Then I wanted to know which Runtime the app used, I renamed all java* .exe, yet it still worked64-bitI renamed all-new regedit keys. It still worked...

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

End of story: with Windows 64 the regedit keys are in HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft(32bit) and

故事结束:对于 Windows 64,regedit 键位于 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft(32 位)和

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft(64bit)

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft(64 位)

and my app worked because

我的应用程序有效,因为

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment.8\RuntimeLib\ 

pointed to jvm.dll which revered a symlink. I need a beer, I want another Job :-)

指向 jvm.dll,它崇敬一个符号链接。我需要一杯啤酒,我想要另一份工作 :-)

Here is a nice link, which explains the Regedit-Keys and the different "discovery methods" which Java uses to find the newest installed version:

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

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

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

Still the SYSLink - Change with JDK8 seems to be an undocumented change which was introduced before JRE8u171.

SYSLink - Change with JDK8 似乎是在 JRE8u171 之前引入的未记录的更改。

My sysLink Path was C:\Program Files (x86)\Common Files\Oracle\Javawith was actually a Junction to a subdirectory. And the JDK8 installer copies the java*.exe files into Windows\System32\ btw.

我的 sysLink 路径C:\Program Files (x86)\Common Files\Oracle\Java实际上是一个子目录的连接点。JDK8 安装程序将 java*.exe 文件复制到 Windows\System32\ btw。

More Infos:

更多信息:

Sorry for my rant, I'm so frustrated right now. I hope it helps somebody else.

对不起,我的咆哮,我现在很沮丧。我希望它可以帮助别人。

回答by StackzOfZtuff

Try java -verbose with findstr

使用 findstr 尝试 java -verbose

Example:

例子:

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

Try reg query with /s

尝试使用 /s 进行 reg 查询

Example:

例子:

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.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.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.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:\>

Try Get-Command java

尝试获取命令 java

Note: If you just care about the version number, then you might want to try PowerShell's Get-Command:

注意:如果您只关心版本号,那么您可能想尝试 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