我有一台计算机是故意安装 JDK 的。我还有一台带有 JRE 的计算机,用于测试。但是,当我让一个 Java 应用程序在这台计算机上运行,然后在另一台计算机上试用时,它抱怨说需要 JDK。如何检查 JDK 是否以某种方式安装在我的系统上?注意: 这台电脑是一台 Mac 电脑。
通常,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
即 find / -name "java"
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目录中的一个链接文件:
java
/usr/bin
$ cd /usr/bin/ && ls -la | grep java
找到指向的位置,如下所示(对我来说) :
然后 cd到指定的目录,找到 Java 的真正主目录:
cd
$ ls -la | grep java
在这种情况下如下:
因此在屏幕截图中很明显,我的 Java 主目录是 /usr/lib/jvm/java-11-openjdk-amd64。因此,我需要将 JAVA _ HOME 添加到 bash 配置文件(.bashrc、 .bash_profile等,这取决于您的操作系统) ,如下所示:
/usr/lib/jvm/java-11-openjdk-amd64
.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 上这不是那么可靠... 例如..。
openjdk
因此,一种更加自动防故障的方法是检查 javac可执行文件是否存在。
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 将会失败(或者通过,这取决于您如何看待它)。请参阅下面的单元测试以获得更多信息..。
sun.boot.library.path
单元测试:
# 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或更高版本。
1.8+
遗憾的是,java_home助手没有设置正确的返回代码,因此检查是否失败需要解析输出(例如 2>&1 |grep -v "Unable") ,该输出根据语言环境的不同而有所不同。
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。
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin