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


134

我有一台故意安装了JDK的计算机。我有一台装有JRE的计算机,用于进行测试。但是,当我在这台计算机上运行一个Java应用程序,然后在另一台计算机上对其进行尝试时,它抱怨说需要JDK。如何检查系统是否以某种方式安装了JDK?注意:相关计算机为Mac。


1
您可以发布错误的全文,包括您尝试运行它的方式吗?您不需要JDK来运行Java程序,只需JRE。
凯文·沃克曼

这是一台朋友计算机-有关安装命令行工具的信息。有机会再次检查时,我会再次评论。
PopKernel 2014年

听起来您可能正在谈论确保Java正常运行,但这只是一个猜测。无论哪种方式,您都只需要JRE即可运行Java程序。您需要JDK进行编译。
Kevin Workman 2014年

只有很少的Java程序需要JDK,IDE,tomcat之类的servlet容器来编译JSP以及其他一些容器。什么样的应用程序有问题?
Arne Burmeister 2014年

Answers:


159

您可以打开终端,只需键入

java -version // this will check your jre version
javac -version // this will check your java compiler version if you installed 

这应该向您显示系统上安装的Java的版本(假设您已在系统环境中设置了Java的路径)。

如果没有,请通过

export JAVA_HOME=/path/to/java/jdk1.x

如果不确定系统上是否有Java,请find在终端中使用

find / -name "java"


1
@MaciejCygan,为什么我的JAVA_HOME指向JRE而不是JDK?
Pacerier 2014年

@Pacerier为什么?? 我不知道那肯定大声笑!也许您没有安装JDK?运行Windows或Linux ??
Maciej Cygan 2014年

@MaciejCygan,我正在使用Windows。是的,我也安装了JDK。
Pacerier,2014年

@Pacerier您可以在环境变量中编辑/或创建一个条目(如果找不到)。
Maciej Cygan 2014年

@MaciejCygan,是的,但是为什么我的JAVA_HOME指向JRE而不是JDK?
Pacerier 2014年

18

通常,jdk安装的环境路径变量中包含javac ...因此,如果您在路径中检查javac,则可以很好地表明您已安装jdk。


3
我意识到OP询问的是Mac,因此那里可能有所不同。但是对于Windows,此测试似乎并不可靠。我刚刚检查javac了一下,但路径中没有,但是确实安装了jdk。(在我的情况下,指向我的JAVA_HOME C:\Program Files\Java\jdk1.8.0_45
kmote '16

是的,您是对的,因为javac实际上位于%JAVA_HOME%\ bin中
Hamed

6

@ maciej-cygan很好地描述了该过程,但是为了找到您的java路径:

$ which java

它为您提供java二进制文件的路径,该文件是/usr/bin目录中的链接文件。下一个:

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

找到指向的位置,如下所示(对我来说):

在此处输入图片说明 然后cd转到指向的目录以找到Java的真实主目录。下一个:

$ ls -la | grep java

在这种情况下如下:

在此处输入图片说明

如屏幕快照中所示,我的Java主目录是/usr/lib/jvm/java-11-openjdk-amd64。所以因此我需要JAVA_HOME添加到我的bash的个人资料(.bashrc.bash_profile,等视操作系统而定),如下图所示:

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

干得好!



0

通用的纯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.pathJRE和JDK之间的JRE相同。例如,运行以上代码时,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,但是在撰写本文时,我还不知道安装了JRE的JRE javac

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.