Ich schreibe ein Programm in Java, das winrar ausführt und eine Jar-Datei, die sich in h:\myjar.jar
befindet, in den Ordner h:\new
entpackt. Mein Java-Code sieht in etwa so aus
import java.io.File;
import java.io.IOException;
public class MainClass {
public static void main(String[] args) {
Runtime r = Runtime.getRuntime();
Process p = null;
try {
File dir = new File("C:/Program Files/WinRAR");
p = r.exec("winrar x h:\\myjar.jar *.* h:\\new", null, dir);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Wenn ich diesen Code ausführe, erhalte ich folgende Fehlermeldung
java.io.IOException: Cannot run program "winrar" (in directory "C:\Program Files\WinRAR"): CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at MainClass.main(MainClass.java:16)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 4 more
Kann mir jemand sagen, warum ich auf ein solches Problem stoße? Welche Änderung muss ich in den Code einbauen, damit es funktioniert?
Angenommen, winrar.exe
befindet sich im PATH
, dann ist Runtime.exec
in der Lage, es zu finden. Ist dies nicht der Fall, müssen Sie den voll qualifizierten Pfad dazu angeben, z.B. unter der Annahme, dass winrar.exe
unter C:/Program Files/WinRAR
installiert ist, müssten Sie etwas wie...
p=r.exec("C:/Program Files/WinRAR/winrar x h:\\myjar.jar *.* h:\\new");
Ich persoenlich wuerde Ihnen empfehlen, ProcessBuilder
zu verwenden, da es unter anderem einige zusaetzliche Konfigurationsmoeglichkeiten bietet. Wo es möglich ist, sollten Sie Ihren Befehl und Ihre Parameter in separate "String"-Elemente aufteilen, da es mit Dingen wie Leerzeichen viel besser umgehen kann als eine einzelne "String"-Variable, zum Beispiel...
ProcessBuilder pb = new ProcessBuilder(
"C:/Program Files/WinRAR/winrar",
"x",
"myjar.jar",
"*.*",
"new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);
Process p = pb.start();
Vergessen Sie nicht, den Inhalt des InputStream
aus dem Prozess zu lesen, da dies sonst zum Stillstand des Prozesses führen kann
Das von Ihnen angegebene dir
ist ein Arbeitsverzeichnis des laufenden Prozesses - es hilft nicht, die ausführbare Datei zu finden. Verwenden Sie cmd /c winrar ...
, um den Prozess zu starten und die ausführbare Datei im PATH zu suchen oder versuchen Sie, den absoluten Pfad zu winrar zu verwenden.
Das komplette erste Argument von exec
wird als die ausführbare Datei interpretiert. verwenden
p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
null,
dir);