我有一台电脑,有意安装了JDK。我有另一台电脑带有JRE,用于测试等工作。但是,当我在该计算机上使Java应用程序运行良好后,在另一台计算机上尝试时,它抱怨需要JDK。如何检查是否已在我的系统上安装了JDK?注意:所涉及的计算机是Mac。
我有一台电脑,有意安装了JDK。我有另一台电脑带有JRE,用于测试等工作。但是,当我在该计算机上使Java应用程序运行良好后,在另一台计算机上尝试时,它抱怨需要JDK。如何检查是否已在我的系统上安装了JDK?注意:所涉及的计算机是Mac。
java -version // this will check your JRE version
javac -version // this will check your java compiler version (JDK) if you installed
export JAVA_HOME=/path/to/java/jdk1.x
find
命令。find / -name "java"
(编辑:command -v java
将在你的PATH中查找Java,当Java已安装且正确放置在PATH中时,比find
命令更快)。通常情况下,jdk安装会将javac添加到环境路径变量中...因此,如果您在路径中检查javac,那基本上就说明您已经安装了jdk。
javac
加入路径中,但是我已经安装了JDK。(在我的情况下,JAVA_HOME指向了C:\Program Files\Java\jdk1.8.0_45
) - kmote@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的解决方案...
对于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组合仍将失败。例如,在运行上述代码时,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
/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
中,但在撰写本文时,我不知道是否有安装了包含 javac
的 JRE。
/Library/Java/JavaVirtualMachines/jdkmajor.minor.macro[_update].jdk
请参考https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html中的卸载JDK部分。
如果您能找到这样的文件夹,则表示已安装JDK。
javac
可能与JAVA_HOME
不一致。javac -version
javac 21.0.1
$JAVA_HOME$
的位置时echo $JAVA_HOME$
C:\Program Files\Java\jdk-19$
PATH
环境变量中。where javac
C:\Program Files\Common Files\Oracle\Java\javapath\javac.exe
%JAVA_HOME%\bin
添加到PATH
中,请点击此处
所有这些发生在我尝试使用不兼容的Java版本使用gradle
/ gradlew clean build
时。