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
Which JRE does C:\ProgramData\Oracle\Java\javapath\java.exe use?
提问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_HOME
to empty or to some random folder, running an application with java.exe
still works. So I can only assume that it isn't using the JAVA_HOME
value. So how does it find the JRE folder? Does it default to something specific? I have no JRE_HOME
var set either.
如果我将 my 设置JAVA_HOME
为空或某个随机文件夹,则运行应用程序java.exe
仍然有效。所以我只能假设它没有使用该JAVA_HOME
值。那么它是如何找到JRE文件夹的呢?它是否默认为特定的东西?我也没有JRE_HOME
var 集。
采纳答案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.exe
etc. in the javapath_target_... folder are not symlinks. These files find JRE and JDK versions using this registry location:
现在,有趣的是,java.exe
javapath_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\Java
with 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:
更多信息:
http://makble.com/jdk-8-and-cprogramdataoraclejavajavapath- What's the sense of
C:\ProgramData\Oracle\Java\javapath
(on Windows 10)?https://community.oracle.com/thread/4143254https://douglascayers.com/2015/05/30/how-to-set-custom-java-path-after-installing-jdk-8/
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/
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