Ogólne, czyste rozwiązanie w języku Java.
W przypadku systemów Windows i MacOS można wywnioskować (w większości przypadków) ...
public static boolean isJDK() {
String path = System.getProperty("sun.boot.library.path");
if(path != null && path.contains("jdk")) {
return true;
}
return false;
}
Jednak ... w systemie Linux nie jest to tak niezawodne ... Na przykład ...
- Wiele środowisk JRE w systemie Linux zawiera
openjdk
ścieżkę
- Nie ma gwarancji, że środowisko JRE nie zawiera również JDK.
Więc bardziej bezpiecznym podejściem jest sprawdzenie istnienia javac
pliku wykonywalnego.
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;
}
Ostrzeżenie: to nadal się nie powiedzie w przypadku combo JRE + JDK, które zgłaszają sun.boot.library.path
identyczne JRE między JRE i JDK. Na przykład JDK Fedory nie powiedzie się (lub przejdzie w zależności od tego, jak na to spojrzysz), gdy powyższy kod zostanie uruchomiony. Zobacz testy jednostkowe poniżej, aby uzyskać więcej informacji ...
Testy jednostkowe:
java -XshowSettings:properties -version 2>&1|grep "sun.boot.library.path"
java -XshowSettings:properties -version 2>&1|find "sun.boot.library.path"
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/lib
c:\Program Files\Java\jdk-12.0.2\bin
C:\Program Files\Java\jre1.8.0_181\bin
C:\Program Files\Java\jdk1.8.0_181\bin
/usr/lib/jvm/adoptopenjdk-11-hotspot-amd64/lib
/usr/lib/jvm/java-11-oracle/lib
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.fc24.x86_64/jre/lib/amd64
/usr/java/jdk1.8.0_231-amd64/jre/lib/amd64