我正在尝试找出java使用哪个环境变量来查找/检测所使用的JRE C:\ProgramData\Oracle\Java\javapath\java.exe。
根据Oracle的设计,我仅有的文件C:\ProgramData\Oracle\Java\javapath\是
java.exejavaw.exejavaws.exe如果我将其设置JAVA_HOME为空或某个随机文件夹,则使用java.exe仍然可以运行应用程序。所以我只能假设它没有使用该JAVA_HOME值。那么如何找到JRE文件夹?是否默认为特定内容?我也没有JRE_HOME设置变量。
acc*_*ted 10
这会给你一个想法:
java -verbose | more
Run Code Online (Sandbox Code Playgroud)
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)
例子:
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 的路径将被包含多次。)
例子:
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)
注意:如果您只关心版本号,那么您可能想尝试 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)
这些“新的” 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中。
更多信息:
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/
很抱歉,我现在很沮丧。我希望它可以帮助其他人。