如何判断JRE或JDK是否已安装

155

我有一台电脑,有意安装了JDK。我有另一台电脑带有JRE,用于测试等工作。但是,当我在该计算机上使Java应用程序运行良好后,在另一台计算机上尝试时,它抱怨需要JDK。如何检查是否已在我的系统上安装了JDK?注意:所涉及的计算机是Mac。


1
你能发布完整的错误文本,包括你如何尝试运行它吗?你不需要JDK来运行Java程序,只需要JRE。 - Kevin Workman
那是朋友的电脑 - 关于安装命令行工具的内容。我再检查一次后会再次评论。 - PopKernel
似乎你在谈论如何确保Java在你的路径上,但这只是我的猜测。无论如何,你只需要JRE来运行Java程序。你需要JDK来编译它们。 - Kevin Workman
只有少数Java程序需要JDK、IDE和Servlet容器(如Tomcat)来编译JSP和其他一些程序。这种问题通常出现在哪种应用程序中? - Arne Burmeister
7个回答

197
你可以打开终端,然后简单地输入
java -version // this will check your JRE version
javac -version // this will check your java compiler version (JDK) if you installed 

这应该显示系统上安装的Java版本(假设您已经在系统环境中设置了Java路径)。
如果您还没有设置,请通过以下方式添加。
export JAVA_HOME=/path/to/java/jdk1.x

如果你不确定你的系统上是否安装了Java,只需在终端中使用find命令。
例如:find / -name "java" (编辑:command -v java将在你的PATH中查找Java,当Java已安装且正确放置在PATH中时,比find命令更快)。

3
@MaciejCygan,为什么我的JAVA_HOME指向的是JRE而不是JDK? - Pacerier
1
@Pacerier 为什么?我不确定,哈哈!也许你没有安装JDK?是在运行Windows还是Linux? - Maciej Cygan
1
@Pacerier 你可以在环境变量中编辑或创建一个条目,如果没有找到的话。 - Maciej Cygan
这个问题是否与Windows有关?如果是的话,“java -version”命令返回一个错误,指出它不是一个被认可的命令。 - ahsant
1
从这个输出中,我如何判断我的安装是JRE还是JDK? - tolache
显示剩余5条评论

22

通常情况下,jdk安装会将javac添加到环境路径变量中...因此,如果您在路径中检查javac,那基本上就说明您已经安装了jdk。


3
我知道提问者是在问关于Mac的情况,所以那里可能会有所不同。但是就Windows而言,这个测试似乎不太可靠。我刚刚检查了一下,发现我没有将javac加入路径中,但是我已经安装了JDK。(在我的情况下,JAVA_HOME指向了C:\Program Files\Java\jdk1.8.0_45 - kmote
是的,你说得对,因为javac实际上位于%JAVA_HOME%\bin目录下。 - Hamed

10

@maciej-cygan描述了这个过程,但是为了找到您的java路径:

$ which java

它会给出java二进制文件的路径,它是一个链接文件在/usr/bin目录下。 接下来:

$ cd /usr/bin/ && ls -la | grep java

找到指向的位置,它是如下所示的内容(对于我而言):

enter image description here 然后cd到指定的目录以查找Java的实际主目录。 接下来:

$ ls -la | grep java

在这种情况下如下所示:

enter image description here

如截图所示,我的Java主目录是/usr/lib/jvm/java-11-openjdk-amd64。因此,我需要像下面这样将JAVA_HOME添加到我的bash配置文件(.bashrc.bash_profile等,具体取决于您的操作系统):

JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"

就这样!


1

一种通用的、纯Java的解决方案...

对于Windows和MacOS,以下内容可以被推断出(大部分情况下)...

public static boolean isJDK() {
    String path = System.getProperty("sun.boot.library.path");
    if(path != null && path.contains("jdk")) {
        return true;
    }
    return false;
}

然而,在Linux上这不是那么可靠...例如:

  • 许多Linux上的JRE包含openjdk路径
  • 不能保证JRE不包含JDK。

因此,更加安全的方法是检查javac可执行文件是否存在。

public static boolean isJDK() {
    String path = System.getProperty("sun.boot.library.path");
    if(path != null) {
        String javacPath = "";
        if(path.endsWith(File.separator + "bin")) {
            javacPath = path;
        } else {
            int libIndex = path.lastIndexOf(File.separator + "lib");
            if(libIndex > 0) {
                javacPath = path.substring(0, libIndex) + File.separator + "bin";
            }
        }
        if(!javacPath.isEmpty()) {
            return new File(javacPath, "javac").exists() || new File(javacPath, "javac.exe").exists();
        }
    }
    return false;
}

警告:对于报告JRE和JDK之间sun.boot.library.path相同的JRE + JDK组合仍将失败。例如,在运行上述代码时,Fedora的JDK将失败(或通过,具体取决于您的看法)。有关更多信息,请参见下面的单元测试...

单元测试:

# Unix
java -XshowSettings:properties -version 2>&1|grep "sun.boot.library.path"
# Windows
java -XshowSettings:properties -version 2>&1|find "sun.boot.library.path"

    # PASS: MacOS AdoptOpenJDK JDK11
    /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/lib

    # PASS: Windows Oracle JDK12
    c:\Program Files\Java\jdk-12.0.2\bin

    # PASS: Windows Oracle JRE8
    C:\Program Files\Java\jre1.8.0_181\bin

    # PASS: Windows Oracle JDK8
    C:\Program Files\Java\jdk1.8.0_181\bin

    # PASS: Ubuntu AdoptOpenJDK JDK11
    /usr/lib/jvm/adoptopenjdk-11-hotspot-amd64/lib

    # PASS: Ubuntu Oracle JDK11
    /usr/lib/jvm/java-11-oracle/lib

    # PASS: Fedora OpenJDK JDK8
    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.fc24.x86_64/jre/lib/amd64

    #### FAIL: Fedora OpenJDK JDK8
    /usr/java/jdk1.8.0_231-amd64/jre/lib/amd64

0
相关计算机是Mac。 适用于macOS的解决方案:
/usr/libexec/java_home -v 1.8+ --exec javac -version

1.8+ 表示 Java 版本为 1.8 或更高版本。

不幸的是,java_home 助手没有设置正确的返回代码,因此检查失败需要解析输出(例如 2>&1 |grep -v "Unable"),这取决于语言环境。

请注意,Java 也可能存在于 /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin 中,但在撰写本文时,我不知道是否有安装了包含 javac 的 JRE。


0

0
只是给Windows用户使用JDK的一个提示。
请注意,javac可能与JAVA_HOME不一致。
例如,我遇到了以下情况:
javac -version
javac 21.0.1

但是当我检查$JAVA_HOME$的位置时
echo $JAVA_HOME$
C:\Program Files\Java\jdk-19$

这显然是因为Java使用了一个连接/符号链接将javac安装到PATH环境变量中。
where javac
C:\Program Files\Common Files\Oracle\Java\javapath\javac.exe

如下所示,我的环境变量如下: enter image description here 更多关于Windows中的符号链接的信息,请点击此处 还有一个解决方案,即将%JAVA_HOME%\bin添加到PATH中,请点击此处 所有这些发生在我尝试使用不兼容的Java版本使用gradle / gradlew clean build

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