繁体   English   中英

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

[英]How to tell if JRE or JDK is installed

我有一台我特意安装了 JDK 的计算机。 我有另一台带有 JRE 的计算机,用于测试等。 但是,当我在这台计算机上运行一个 java 应用程序,然后在另一台计算机上尝试它时,它抱怨需要 JDK。 如何检查 JDK 是否以某种方式安装在我的系统上? 注意:有问题的计算机是 Mac。

您可以打开终端并简单地输入

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"

通常,jdk 安装在环境路径变量中有 javac ......因此,如果您在路径中检查 javac,这几乎是您安装了 jdk 的一个很好的指标。

@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"

干得好!

根据JAVA文档,JDK应该安装在这个路径:

/Library/Java/JavaVirtualMachines/jdkmajor.minor.macro[_update].jdk

请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html 上的卸载 JDK 部分

因此,如果您可以找到这样的文件夹,则安装了 JDK

一个通用的纯 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 之间报告 JRE 的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

有问题的计算机是 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 也包含javac

在macos终端上,您可以输入:

java -version (对于jre)

javac -version (用于编译器版本)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM