我有一台故意安装了JDK的计算机。我有一台装有JRE的计算机,用于进行测试。但是,当我在这台计算机上运行一个Java应用程序,然后在另一台计算机上对其进行尝试时,它抱怨说需要JDK。如何检查系统是否以某种方式安装了JDK?注意:相关计算机为Mac。
我有一台故意安装了JDK的计算机。我有一台装有JRE的计算机,用于进行测试。但是,当我在这台计算机上运行一个Java应用程序,然后在另一台计算机上对其进行尝试时,它抱怨说需要JDK。如何检查系统是否以某种方式安装了JDK?注意:相关计算机为Mac。
Answers:
您可以打开终端,只需键入
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"
@ maciej-cygan很好地描述了该过程,但是为了找到您的java路径:
$ which java
它为您提供java
二进制文件的路径,该文件是/usr/bin
目录中的链接文件。下一个:
$ cd /usr/bin/ && ls -la | grep 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上,它不那么可靠...例如...
openjdk
路径因此,一种更安全的故障排除方法是检查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.path
JRE和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
该计算机是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
。