Per ragioni di completezza, mi permetta di dire che ci sono alcuni posti (su un PC Windows) per cercare javaw.exe
nel caso sia non trovato nel percorso: (Ancora suggerimento Reimeus' dovrebbe essere il tuo primo tentativo.)
1.
Java di solito memorizza la sua posizione nel Registro di sistema, nella seguente chiave:
HKLM\Software\JavaSoft\Java Runtime Environement\<CurrentVersion>\JavaHome
2.
recenti versioni di JRE/JDK, sembrano mettere anche una copia di javaw.exe
in 'C: \ Windows \ System32', così si potrebbe voler controllare anche lì (anche se le probabilità sono, se è lì, sarà trovato anche nel percorso).
3.
Naturalmente ci sono i "soliti" install posizioni:
- 'C: \ Program Files \ Java \ jre * \ bin'
- 'C: \ Program Files \ Java \ JDK * \ bin'
- 'C: \ Program Files (x86) \ Java \ jre * \ bin'
- 'C: \ Program Files (x86) \ Java \ JDK * \ bin'
[Si noti che per le versioni precedenti di Windows (XP, Vista (?)), Questo è utile solo nelle versioni inglesi del sistema operativo. Fortunatamente, nella versione successiva di Windows "Program Files" punterà alla directory indipendentemente dal suo "nome visualizzato" (che è specifico della lingua).]
Un po 'di tempo fa, ho scritto questo pezzo di codice per verificare javaw.exe
nei suddetti luoghi. Forse qualcuno lo trova utile:
static protected String findJavaw() {
Path pathToJavaw = null;
Path temp;
/* Check in Registry: HKLM\Software\JavaSoft\Java Runtime Environement\<CurrentVersion>\JavaHome */
String keyNode = "HKLM\\Software\\JavaSoft\\Java Runtime Environment";
List<String> output = new ArrayList<>();
executeCommand(new String[] {"REG", "QUERY", "\"" + keyNode + "\"",
"/v", "CurrentVersion"},
output);
Pattern pattern = Pattern.compile("\\s*CurrentVersion\\s+\\S+\\s+(.*)$");
for (String line : output) {
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
keyNode += "\\" + matcher.group(1);
List<String> output2 = new ArrayList<>();
executeCommand(
new String[] {"REG", "QUERY", "\"" + keyNode + "\"",
"/v", "JavaHome"},
output2);
Pattern pattern2
= Pattern.compile("\\s*JavaHome\\s+\\S+\\s+(.*)$");
for (String line2 : output2) {
Matcher matcher2 = pattern2.matcher(line2);
if (matcher2.find()) {
pathToJavaw = Paths.get(matcher2.group(1), "bin",
"javaw.exe");
break;
}
}
break;
}
}
try {
if (Files.exists(pathToJavaw)) {
return pathToJavaw.toString();
}
} catch (Exception ignored) {}
/* Check in 'C:\Windows\System32' */
pathToJavaw = Paths.get("C:\\Windows\\System32\\javaw.exe");
try {
if (Files.exists(pathToJavaw)) {
return pathToJavaw.toString();
}
} catch (Exception ignored) {}
/* Check in 'C:\Program Files\Java\jre*' */
pathToJavaw = null;
temp = Paths.get("C:\\Program Files\\Java");
if (Files.exists(temp)) {
try (DirectoryStream<Path> dirStream
= Files.newDirectoryStream(temp, "jre*")) {
for (Path path : dirStream) {
temp = Paths.get(path.toString(), "bin", "javaw.exe");
if (Files.exists(temp)) {
pathToJavaw = temp;
// Don't "break", in order to find the latest JRE version
}
}
if (pathToJavaw != null) {
return pathToJavaw.toString();
}
} catch (Exception ignored) {}
}
/* Check in 'C:\Program Files (x86)\Java\jre*' */
pathToJavaw = null;
temp = Paths.get("C:\\Program Files (x86)\\Java");
if (Files.exists(temp)) {
try (DirectoryStream<Path> dirStream
= Files.newDirectoryStream(temp, "jre*")) {
for (Path path : dirStream) {
temp = Paths.get(path.toString(), "bin", "javaw.exe");
if (Files.exists(temp)) {
pathToJavaw = temp;
// Don't "break", in order to find the latest JRE version
}
}
if (pathToJavaw != null) {
return pathToJavaw.toString();
}
} catch (Exception ignored) {}
}
/* Check in 'C:\Program Files\Java\jdk*' */
pathToJavaw = null;
temp = Paths.get("C:\\Program Files\\Java");
if (Files.exists(temp)) {
try (DirectoryStream<Path> dirStream
= Files.newDirectoryStream(temp, "jdk*")) {
for (Path path : dirStream) {
temp = Paths.get(path.toString(), "jre", "bin", "javaw.exe");
if (Files.exists(temp)) {
pathToJavaw = temp;
// Don't "break", in order to find the latest JDK version
}
}
if (pathToJavaw != null) {
return pathToJavaw.toString();
}
} catch (Exception ignored) {}
}
/* Check in 'C:\Program Files (x86)\Java\jdk*' */
pathToJavaw = null;
temp = Paths.get("C:\\Program Files (x86)\\Java");
if (Files.exists(temp)) {
try (DirectoryStream<Path> dirStream
= Files.newDirectoryStream(temp, "jdk*")) {
for (Path path : dirStream) {
temp = Paths.get(path.toString(), "jre", "bin", "javaw.exe");
if (Files.exists(temp)) {
pathToJavaw = temp;
// Don't "break", in order to find the latest JDK version
}
}
if (pathToJavaw != null) {
return pathToJavaw.toString();
}
} catch (Exception ignored) {}
}
return "javaw.exe"; // Let's just hope it is in the path :)
}
Vuoi l'eseguibile che esegue il codice Java corrente, o qualsiasi javaw.exe arbitraria? –
@AndyThomas Qualsiasi arbitrario. Se esistono più 'javaw.exe', quindi l'ultimo :) –
Esistono API di ricerca specifiche del sistema operativo per trovare i file e per ottenere la versione da un eseguibile. Su Windows, puoi utilizzare l'API di ricerca di Windows per cercare e :: GetFileVersionInfo (...) per ottenere la versione. Si noti che la ricerca può richiedere del tempo per il completamento. Un'alternativa è quella di spedire la propria JVM, rendendo banale la ricerca di un percorso relativo. –