java.io.IOException: CreateProcess: c:/ error=5
at java.lang.Win32Process.create(Native Method)
at java.lang.Win32Process.<init>(Win32Process.java:63)
at java.lang.Runtime.execInternal(Native Method)
Se ricordo correttamente, il codice di errore 5 significa accesso negato.Ciò potrebbe essere dovuto al fatto che il tuo percorso non è corretto (cercando di eseguire "c: /") o stai urtando contro la tua sicurezza del sistema operativo (nel qual caso, guarda le autorizzazioni).
Se si hanno problemi a trovare l'eseguibile Java, di solito si può trovare usando le proprietà del sistema:
public class LaunchJre {
private static boolean isWindows() {
String os = System.getProperty("os.name");
if (os == null) {
throw new IllegalStateException("os.name");
}
os = os.toLowerCase();
return os.startsWith("windows");
}
public static File getJreExecutable() throws FileNotFoundException {
String jreDirectory = System.getProperty("java.home");
if (jreDirectory == null) {
throw new IllegalStateException("java.home");
}
File exe;
if (isWindows()) {
exe = new File(jreDirectory, "bin/java.exe");
} else {
exe = new File(jreDirectory, "bin/java");
}
if (!exe.isFile()) {
throw new FileNotFoundException(exe.toString());
}
return exe;
}
public static int launch(List<String> cmdarray) throws IOException,
InterruptedException {
byte[] buffer = new byte[1024];
ProcessBuilder processBuilder = new ProcessBuilder(cmdarray);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
InputStream in = process.getInputStream();
while (true) {
int r = in.read(buffer);
if (r <= 0) {
break;
}
System.out.write(buffer, 0, r);
}
return process.waitFor();
}
public static void main(String[] args) {
try {
Runtime.getRuntime().exec("c:/");
List<String> cmdarray = new ArrayList<String>();
cmdarray.add(getJreExecutable().toString());
cmdarray.add("-version");
int retValue = launch(cmdarray);
if (retValue != 0) {
System.err.println("Error code " + retValue);
}
System.out.println("OK");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
(Testato su Windows XP, Sun JRE 1.6, Ubuntu 8.04, OpenJDK JRE 1.6)
Questo è l'equivalente di esecuzione:
java -version
si consiglia inoltre di guardare la proprietà di sistema "java.library.path" (e "path.separator") quando si cerca di individuare l'executabl e.
Che cosa significa il getMessage() su tale IOException tornare? –
Vuoi eseguirlo in una VM diversa? Puoi sempre creare un nuovo thread e lasciare che l'altro programma funzioni. –
java.io.IOException: CreateProcess: c:/error = 5 in java.lang.Win32Process.create (metodo nativo) in java.lang.Win32Process. (Win32Process.java:63) in java.lang.Runtime.execInternal (metodo nativo) –
Arun