Một giải pháp Java thuần túy, chung chung ..
Đối với Windows và MacOS, phần sau có thể được suy ra (hầu hết thời gian) ...
public static boolean isJDK() {
String path = System.getProperty("sun.boot.library.path");
if(path != null && path.contains("jdk")) {
return true;
}
return false;
}
Tuy nhiên ... trên Linux, điều này không đáng tin cậy ... Ví dụ ...
- Nhiều JRE trên Linux chứa
openjdk
đường dẫn
- Không có gì đảm bảo rằng JRE cũng không chứa JDK.
Vì vậy, một cách tiếp cận không an toàn hơn là kiểm tra sự tồn tại của javac
thực thi.
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;
}
Cảnh báo: Điều này vẫn sẽ thất bại đối với các combo JRE + JDK báo cáo JRE sun.boot.library.path
giống hệt nhau giữa JRE và JDK. Ví dụ, JDK của Fedora sẽ thất bại (hoặc vượt qua tùy thuộc vào cách bạn nhìn vào nó) khi đoạn mã trên được chạy. Xem các bài kiểm tra đơn vị dưới đây để biết thêm ...
Bài kiểm tra đơn vị:
# 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