如何找到Windows计算机上JDK的安装位置?


303

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

Java -versioncmd中运行时,它将版本显示为“ 1.6.xx”。要在我尝试使用的计算机上查找此SDK的位置,echo %JAVA_HOME%但仅显示“ JAVA_HOME”(因为我的环境变量中未设置“ JAVA_PATH”变量)。


1
不幸的是,我认为以下某些答案可能无法正常工作,因为随着Java的最新版本显然有所改变。今天,我下载了7.60 Java SDK版本。搜索后,在C:\ Program Files(x86)\ Java \ jdk1.7.0_60中找到它。已经安装了较旧的版本6 JRE。它位于C:\ Program Files \ Java,位于%PATH%而不是较新的安装目录中。
likejudo 2014年

1
最好的答案是在底部,这是majkinetor的PowerShell单行代码:$ p ='HKLM:\ SOFTWARE \ JavaSoft \ Java Development Kit'; $ v =(gp $ p).CurrentVersion; (gp $ p / $ v).JavaHome
JohnP2,18年

还有一件事,如果您的jdk与intellij idea捆绑在一起,那么它可能在idea安装附近。对我来说,它位于idea文件夹上的1目录文件夹中,PATH变量指向Program Files中的jre
KGS

Answers:


329

如果您使用的是Linux / Unix / Mac OS X:

尝试这个:

$ which java

应该输出确切的位置。

之后,您可以JAVA_HOME自己设置环境变量。

在我的计算机(Mac OS X-雪豹)中:

$ which java
/usr/bin/java
$ ls -l /usr/bin/java
lrwxr-xr-x  1 root  wheel  74 Nov  7 07:59 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

如果您使用Windows:

c:\> for %i in (java.exe) do @echo.   %~$PATH:i

实际上,%VAR_NAME%的形式是Windows
sblundy

1
用Linux / Unix / Mac OS X Windows示例更新了答案。
Pablo Santa Cruz

125
where java在Windows(至少在Windows 7中的),但是如果你真的想要一个JDK,而不是一个JRE的作品,你需要在“箱子返回目录中查找/ javac的/
乔恩·斯特雷耶

如果java.exe在Path上,则Java不提供完整路径,而Pablo for ...解决方案则更可取。
理查德·约翰逊

1
MacOS ls -l $(which java) | awk '{print $11}'
单线版

111

Windows>开始> cmd>

C:> for %i in (javac.exe) do @echo.   %~$PATH:i

如果安装了JDK,则显示路径,
例如:C:\Program Files\Java\jdk1.6.0_30\bin\javac.exe


16
Windows(7+)=>其中javac.exe
hB0 2013年

6
在Windows中,是Java
Pabitra Dash 2015年

10
where java仅当可执行文件在PATH中时才起作用。如果出于某种原因,javac不在路径中,则不会返回任何结果,但这并不意味着未安装JDK。因此,通常情况下,@ grokster解决方案提出的文件搜索解决方案将保证结果(可能需要花费一些时间才能完成)。
Nikita G.

“ for-loop”的东西不起作用,但是,我在这里找到了它:C:\ Program Files(x86)\ Java \ jdk1.6.0_24 \ bin>
AjayKumarBasuthkar '16

请注意,如果您按照本(codelabs.developers.google.com/codelabs/…)教程使用android studio,则实际路径将不是上述命令返回的路径。最有可能的,你就必须像“C:\\ Program Files文件\的Java | <JDK>”,其中,代替“JDK”你会有像“JDK-10.0.1”为JDK版本10
Euler_Salter

96

在Windows的命令提示符下

where javac


8
在Windows中,是Java
Pabitra Dash 2015年

7
注意,这仅在javac在PATH中时才有效。如果未找到,此命令将显示未找到,但仍可以安装JDK。如果您在安装JDK之后尚未更新PATH,请使用其他方法。
Nikita G.

1
还有什么其他方法?您提到了在(javac.exe)中为%i使用@echo。%〜$ PATH:i,但是正如您所写,如果您未在PATH中设置它,它将无法工作。
Nimrod


26

Java安装程序会将几个文件放入%WinDir%\ System32文件夹中(java.exe,javaws.exe等)。当您在命令行中键入java.exe或没有完整路径的创建过程时,如果%PATH%文件夹中缺少这些内容,Windows将作为最后的手段运行它们。

您可以查找注册表中安装的所有Java版本。查看适用于64位Windows上32位Java的HKLM \ SOFTWARE \ JavaSoft \ Java运行时环境和HKLM \ SOFTWARE \ Wow6432Node \ JavaSoft \ Java运行时环境。

这就是java本身如何查找安装的不同版本的方式。这就是为什么32位和64位版本可以共存并在不干扰的情况下正常工作的原因。


23

在Windows平台上简单明了:

哪里java


8
这将导致Java位置错误:C:\ WINDOWS \ System32 \ java.exe。但是实际的jdk安装在C:\ Java \ jdk1.7.0 \(设置了JAVA_HOME)
Himanshu Bhardwaj

17

下面的批处理脚本将打印出现有的默认JRE。通过使用Java Development Kit替换Java Runtime Environment,可以轻松地对其进行修改以找到已安装的JDK版本。

@echo off

setlocal

::- Get the Java Version
set KEY="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
set VALUE=CurrentVersion
reg query %KEY% /v %VALUE% 2>nul || (
    echo JRE not installed 
    exit /b 1
)
set JRE_VERSION=
for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do (
    set JRE_VERSION=%%b
)

echo JRE VERSION: %JRE_VERSION%

::- Get the JavaHome
set KEY="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment\%JRE_VERSION%"
set VALUE=JavaHome
reg query %KEY% /v %VALUE% 2>nul || (
    echo JavaHome not installed
    exit /b 1
)

set JAVAHOME=
for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do (
    set JAVAHOME=%%b
)

echo JavaHome: %JAVAHOME%

endlocal

16

在Windows 10上,您可以通过转到控制面板> Java找到路径。在显示的面板中,您可以找到下面的屏幕快照所示的路径。在Java控制面板中,转到“ Java”选项卡,然后单击“查看和管理Java应用程序和applet的Java运行时版本和设置”描述下的“查看”按钮。

这应该在Windows 7以及其他可能的Windows新版本上运行。

在此处输入图片说明


我在Windows 10上,控制面板中没有Java
Lang React Dev

1
您确定已安装Java,并且已使用Windows安装软件包安装了Java?
smartexpert

您可以尝试查看您的帐户和系统环境变量,以找出Java可能安装在哪里,寻找javacpl.exe
smartexpert

12

在Windows命令提示符下,只需键入:

set java_home

或者,如果您不喜欢命令环境,则可以从以下位置进行检查:

开始菜单>计算机>系统属性>高级系统属性。然后打开“高级”选项卡>“环境变量”,然后在系统变量中尝试找到JAVA_HOME。

在此处输入图片说明


这给了我jdk文件夹。当我在Scala工作表中运行System.getProperty(“ java.home”)时,它为我提供了jre子文件夹。Java Home显然存在一些歧义。
伊恩·弗里曼

11

在Windows下,您可以使用

C:>dir /b /s java.exe

可以打印C:驱动器上每个“ java.exe”的完整路径,而不管它们是否位于PATH环境变量中。


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


9

从命令行运行此程序:

// 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,并且首先在路径上,它将找到一个JRE。
乔恩·斯特雷尔

9

Powershell一里衬:

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

1
对于JDK 11,使用$p='HKLM:\SOFTWARE\JavaSoft\JDK'; $v=(gp $p).CurrentVersion; (gp $p/$v).JavaHome
Diomidis Spinellis,

6

您是否尝试过查看%PATH%变量。这就是Windows用于查找任何可执行文件的方法。


是的 Echo %PATH%. 矿似乎是c:\Program Files\Java在Windows 7
马克·欧文

5

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

或者,如果在Unix上,您可以简化它:

$ set | grep "JAVA_HOME" 

感谢Roflcoptr,了解“设置”确实很有用。在我的系统中,它显示了两个相同变量的条目,如何删除不正确的条目。
Ashine 2011年

3

这是特定于操作系统的。在Unix上:

which java

将显示可执行文件的路径。我不知道Windows的等效版本,但通常bin在系统中有JDK安装文件夹PATH

echo %PATH%

我也想给出答案,但是他显然正在寻找Windows答案。
唐·布兰森

@DonBranson在此文章提交后,他将文本更改为包括Windows。
EntangledLoops

2

如果您正在寻找包含子目录(例如:bin,docs,include,jre,lib等)的主目录,则这些答案均不适用于Linux。

在适用于openjdk1.8.0的Ubuntu上,该文件位于: /usr/lib/jvm/java-1.8.0-openjdk-amd64

并且您可能更喜欢使用它,JAVA_HOME因为如果您构建JNI源文件,则可以找到标头。虽然确实which java会提供二进制路径,但它不是真正的JDK主页。


1

在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


0
#!/bin/bash

if [[ $(which ${JAVA_HOME}/bin/java) ]]; then
    exe="${JAVA_HOME}/bin/java"
elif [[ $(which java) ]]; then
    exe="java"
else 
    echo "Java environment is not detected."
    exit 1
fi

${exe} -version

对于Windows:

@echo off
if "%JAVA_HOME%" == "" goto nojavahome

echo Using JAVA_HOME            :   %JAVA_HOME%

"%JAVA_HOME%/bin/java.exe" -version
goto exit

:nojavahome
echo The JAVA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program.
goto exit

:exit

该链接可能有助于解释如何从bash查找Java可执行文件:http : //srcode.org/2014/05/07/detect-java-executable/


1
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。
Shaiful Islam

1
谢谢@ShaifulIslam,您的观点是正确的。我从链接中添加了代码。
钱陈

0

如果需要,我通过在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位注册表的参考


0

适用于32/64位Windows的脚本。

@echo off

setlocal enabledelayedexpansion

::- Get the Java Version
set KEY="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
set KEY64="HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment"
set VALUE=CurrentVersion
reg query %KEY% /v %VALUE% 2>nul || (
    set KEY=!KEY64!
    reg query !KEY! /v %VALUE% 2>nul || (
    echo JRE not installed 
    exit /b 1
)
)

set JRE_VERSION=
for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do (
    set JRE_VERSION=%%b
)

echo JRE VERSION: %JRE_VERSION%

::- Get the JavaHome
set KEY="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment\%JRE_VERSION%"
set KEY64="HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\%JRE_VERSION%"
set VALUE=JavaHome
reg query %KEY% /v %VALUE% 2>nul || (
    set KEY=!KEY64!
    reg query !KEY! /v %VALUE% 2>nul || (
    echo JavaHome not installed
    exit /b 1
)
)

set JAVAHOME=
for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do (
    set JAVAHOME=%%b
)

echo JavaHome: %JAVAHOME%

endlocal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.