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

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

307451 次浏览

通常,jdk 安装在环境路径变量中有 javac... ... 所以如果您在路径中检查 javac,那就很好地说明您已经安装了 jdk。

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

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"

根据 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

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

给你!

一个通用的纯 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 安装在 /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin中,它也包含 javac