有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (6) 个答案

  1. # 1 楼答案

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

    给你

  2. # 3 楼答案

    the computer in question is a 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

  3. # 4 楼答案

    通常情况下,jdk安装的环境路径变量中有javac。。。因此,如果您在路径中检查javac,这基本上是一个很好的指标,表明您已经安装了jdk

  4. # 5 楼答案

    一个通用的纯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
    
  5. # 6 楼答案

    你可以打开终端,只需输入

    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,只需在terminal中使用find

    find / -name "java"