ProcessBuilder findet Datei nicht

Endymion

Bekanntes Mitglied
Hi, ich will mit einem Programm eine ausführbare .jar-Datei ausführen. Die Datei existiert im Verzeichnis C:\Users\Admin\Documents\unzip. Wenn ich nun aber mein Programm starte, kommt folgende Fehlermeldung:

java.io.IOException: Cannot run program "unzipper.jar" (in directory "C:\Users\Admin\Documents\unzip"): CreateProcess error=2, Das System kann die angegebene Datei nicht finden
at java.lang.ProcessBuilder.start(Unknown Source)
at UnzipSimulation.main(UnzipSimulation.java:17)
Caused by: java.io.IOException: CreateProcess error=2, Das System kann die angegebene Datei nicht finden
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 2 more

Hat jemand ne Ahnung, was ich falsch mache?

Java:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class UnzipSimulation {
	public static void main(String[] args) {
			try {
				FileWriter fw = new FileWriter(new File(
						"C:\\Users\\Admin\\Documents\\unzip\\simulation_protocol.txt"));
				for (int i = 1; i <= 4194304; i *= 2) {
					ProcessBuilder pb = new ProcessBuilder("unzipper.jar",
							"D:\\javasoftware.zip",
							"C:\\Users\\Admin\\Documents\\unzip\\ " + i, "" + i);
					pb.directory(new File("C:\\Users\\Admin\\Documents\\unzip"));
					try {
						Process p = pb.start();
						fw.write(String.format("puffer size %d: duration:%dms%n", i, (long) p.waitFor() * 100));
					} catch (IOException e) {
						e.printStackTrace();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
}
 
Also SO wirst du keine JAR ausführen können (wie kommst du überhaupt darauf ?).
Versuch mal eher sowas : "java -jar PFAD/file.jar".
 
Ich finde, du machst das VIEL zu kompliziert.

Java:
public static void main(String... args) throws IOException {
	Path myJar = Paths.get("C:", "Users", "Admin", "Documents", "unzip");
	Runtime.getRuntime().exec( "java -jar " + myJar.resolve("unzipper.jar") );
}

und imho noch besser:
Java:
public static void main(String... args) throws IOException {
	Path myJar = Paths.get(System.getProperty("user.home"), //falls du mit Admin angemeldet bist
			"Documents", "unzip");
	Runtime.getRuntime().exec( "java -jar " + myJar.resolve("unzipper.jar") );
}
 
Zuletzt bearbeitet:
Ich finde, du machst das VIEL zu kompliziert.

Wieso?
ProcessBuilder ist Runtime#exec vorzuziehen. Man sollte die Kommandozeile immer als Array/Collection bzw. in mehreren Werten übergeben, nicht selber mit + konkatinieren. Das macht oft Probleme z.B. bei Leerzeichen im Pfad.

Außerdem sollte noch STDOUT und STERR konsumiert werden. Wenn das nicht gemacht wird, kann es sein, dass der Task einfach blockiert, wenn der Puffer vollgelaufen ist.

Mal zu dem Thema googlen, ein Tutorial ansehen, ... ist nicht so "einfach" wie es aussieht...
z.B.:
Java Tips - From Runtime.exec() to ProcessBuilder
 

Zurück
Oben