如何在Windows机器上查找JDK的安装位置?

402

我需要知道JDK在我的计算机上的位置。

命令提示符中运行java -version,它会显示版本为“1.6.xx”。 为了找到此SDK在我的计算机上的位置,我尝试使用echo %JAVA_HOME%,但它只显示“JAVA_HOME”(因为在我的环境变量中没有设置“JAVA_PATH”变量)。


2
不幸的是,我认为下面的一些答案可能行不通,因为显然在更近期的Java版本中有些事情已经改变了。今天我下载了7.60版本的Java SDK。经过一番搜索,我发现它位于C:\Program Files (x86)\Java\jdk1.7.0_60。还有一个旧版本6的JRE已经安装好了。它位于C:\Program Files\Java,而且它在%PATH%上而不是新的安装路径。 - likejudo
1
最佳答案在底部,来自 PowerShell 的 majkinetor 的一行代码:$p='HKLM:\SOFTWARE\JavaSoft\Java Development Kit'; $v=(gp $p).CurrentVersion; (gp $p/$v).JavaHome - JohnP2
1
还有一件事,如果你的JDK是与IntelliJ IDEA捆绑在一起的,它可能会在IDEA安装附近的某个地方。对我来说,它在一个比IDEA文件夹高一级的文件夹中,并且PATH变量指向Program Files中的一个JRE。 - KGS
25个回答

15
在 Windows PowerShell 中,您可以使用 Get-Command 函数来查看 Java 安装在哪个位置:
Get-Command -All java

或者

gcm -All java

-All部分确保在路径查找中显示所有出现的位置。以下是示例输出。

PS C:> gcm -All java

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     java.exe                                           8.0.202.8  C:\Program Files (x86)\Common Files\Oracle\Java\jav...
Application     java.exe                                           8.0.131... C:\ProgramData\Oracle\Java\javapath\java.exe

12

PowerShell一行命令:

$p='HKLM:\SOFTWARE\JavaSoft\Java Development Kit'; $v=(gp $p).CurrentVersion; (gp $p/$v).JavaHome

3
在JDK 11中使用$p='HKLM:\SOFTWARE\JavaSoft\JDK'; $v=(gp $p).CurrentVersion; (gp $p/$v).JavaHome - Diomidis Spinellis

11

从命令行运行该程序:

// File: Main.java
public class Main {

    public static void main(String[] args) {
       System.out.println(System.getProperty("java.home"));
    }

}


$ javac Main.java
$ java Main

4
她不是需要先编译这个吗? - Irwin
2
如果已经安装并在路径中,它将找到JRE。 - Jon Strayer

10

关于Windows系统... 变量java.home并不总是与运行的二进制文件相同位置。

正如Denis The Menace所说,安装程序会将Java文件放在Program Files中,但也将java.exe放在System32中。如果路径中没有任何与Java相关的内容,则java -version仍然可以工作。但是当运行PeterMmm的程序时,它将Program Files的值报告为java.home,这并没有错(Java确实安装在那里),但实际运行的二进制文件位于System32中。

查找java.exe二进制文件位置的一种方法是,在PeterMmm的代码中添加以下行以使程序运行更长时间:

try{Thread.sleep(60000);}catch(Exception e) {}

编译并运行它,然后查找java.exe图像的位置。例如,在Windows 7中打开任务管理器,找到java.exe条目,右键单击并选择“打开文件位置”,这将打开Java二进制文件的精确位置。在这种情况下,它将位于System32


8

您尝试过查看您的 %PATH% 变量吗?这是 Windows 用来查找任何可执行文件的。


没错。Echo %PATH%. 我的似乎在 Windows 7 上的 c:\Program Files\Java 中。 - Mark Irvin

6

只需在命令行中执行set命令,然后您就可以查看所有已设置的环境变量。

如果在Unix上,您可以简化操作:

$ set | grep "JAVA_HOME" 

谢谢Roflcoptr,学习“set”确实很有用。在我的系统中,同一个变量显示了两个条目,我该如何删除错误的条目? - Ashine

4

在 macOS 上运行:

cd /tmp && echo 'public class Main {public static void main(String[] args) {System.out.println(System.getProperty("java.home"));}}' > Main.java && javac Main.java && java Main

在我的电脑上,这将打印出:
/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home

请注意,运行命令which java并不能显示JDK的位置,因为java命令实际上是JavaVM.framework的一部分,该框架包装了真正的JDK。
$ which java
/usr/bin/java
/private/tmp
$ ls -l /usr/bin/java
lrwxr-xr-x  1 root  wheel  74 14 Nov 17:37 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

4
这是与操作系统相关的。在Unix系统中:
which java

将显示可执行文件的路径。我不知道Windows上是否有相应的功能,但通常在系统PATH中有JDK安装的bin文件夹:

echo %PATH%

我也想给那个答案,但是他显然需要一个Windows的答案。 - Don Branson
@DonBranson在提交此帖子后更改了文本,加入了Windows。 - EntangledLoops

2

如果你正在寻找包括子目录(如:bin,docs,include,jre,lib,etc.)的主目录,那么对于Linux来说,这些答案都是不正确的。

对于Ubuntu上的openjdk1.8.0,它位于: /usr/lib/jvm/java-1.8.0-openjdk-amd64

你可能更喜欢使用它作为JAVA_HOME,因为如果你编译JNI源文件,你将能够找到头文件。虽然which java会提供二进制路径,但它不是真正的JDK home。


1

我通过测试64位和32位注册表中的注册表键(如果需要)来改进了munsingh上面的答案:

::- Test for the registry location  
SET VALUE=CurrentVersion
SET KEY_1="HKLM\SOFTWARE\JavaSoft\Java Development Kit"
SET KEY_2=HKLM\SOFTWARE\JavaSoft\JDK
SET REG_1=reg.exe
SET REG_2="C:\Windows\sysnative\reg.exe"
SET REG_3="C:\Windows\syswow64\reg.exe"

SET KEY=%KEY_1%
SET REG=%REG_1%
%REG% QUERY %KEY% /v %VALUE% 2>nul
IF %ERRORLEVEL% EQU 0 GOTO _set_value

SET KEY=%KEY_2%
SET REG=%REG_1%
%REG% QUERY %KEY% /v %VALUE% 2>nul
IF %ERRORLEVEL% EQU 0 GOTO _set_value

::- %REG_2% is for 64-bit installations, using "C:\Windows\sysnative"
SET KEY=%KEY_1%
SET REG=%REG_2%
%REG% QUERY %KEY% /v %VALUE% 2>nul
IF %ERRORLEVEL% EQU 0 GOTO _set_value

SET KEY=%KEY_2%
SET REG=%REG_2%
%REG% QUERY %KEY% /v %VALUE% 2>nul
IF %ERRORLEVEL% EQU 0 GOTO _set_value

::- %REG_3% is for 32-bit installations on a 64-bit system, using "C:\Windows\syswow64"
SET KEY=%KEY_1%
SET REG=%REG_3%
%REG% QUERY %KEY% /v %VALUE% 2>nul
IF %ERRORLEVEL% EQU 0 GOTO _set_value

SET KEY=%KEY_2%
SET REG=%REG_3%
%REG% QUERY %KEY% /v %VALUE% 2>nul
IF %ERRORLEVEL% EQU 0 GOTO _set_value

:_set_value
FOR /F "tokens=2,*" %%a IN ('%REG% QUERY %KEY% /v %VALUE%') DO (
    SET JDK_VERSION=%%b
)
SET KEY=%KEY%\%JDK_VERSION%
SET VALUE=JavaHome
FOR /F "tokens=2,*" %%a IN ('%REG% QUERY %KEY% /v %VALUE%') DO (
    SET JAVAHOME=%%b
)
ECHO "%JAVAHOME%"
::- SETX JAVA_HOME "%JAVAHOME%"

访问64位注册表的参考


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接