एक सामान्य, शुद्ध जावा समाधान ।।
Windows और MacOS के लिए, निम्नलिखित का अनुमान लगाया जा सकता है (अधिकांश समय) ...
public static boolean isJDK() {
String path = System.getProperty("sun.boot.library.path");
if(path != null && path.contains("jdk")) {
return true;
}
return false;
}
हालाँकि ... लिनक्स पर यह उतना विश्वसनीय नहीं है ... उदाहरण के लिए ...
- लिनक्स पर कई 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 combos के लिए विफल होगा जो JRE की sun.boot.library.path
JRE और JDK के बीच की पहचान की रिपोर्ट करता है । उदाहरण के लिए, उपरोक्त कोड चलने पर फेडोरा का 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