# Probleme beim ProcessBuilder



## Dukeatcoding (10. August 2007)

Ich bin gerade dabei ein Makesystem zu schreiben. Anhand von einer XML Datei kann man angeben was für Dinge kompeliert werden sollen, mit welchen Compilern.


```
<Makesystem>
	<tool>
		<name>java</name>
		<cmd>D:\Programme\Java\jdk1.6.0_01\bin\javac</cmd>
	</tool>
	<output>
		 <name>outputa</name>
		 <usetool>java</usetool>
		 <argument>-cp D:\</argument>
		 <argument>D:\Hello.java</argument>
	</output> 
</Makesystem>
```


Das Parsen der XML Datei ist kein Problem und auch das vernünftige Zwischenspeichern in Objekten und wieder auslesen nicht. Meine Probleme fangen im Prinzip beim Ausführen der Befehle an. Ich hab auf einem Beispiel hier aussem Forum von Tom folgendes zu Wege gebracht.


```
import java.util.*;
import java.io.*;

public class Compiler {
	private ToolHandler tools;
	private OutputHandler outputs;
	private ArrayList<Output> outputsArray;
	
	// Fuer run
	private String name, toolname;
	private ArrayList arguments;
	private Output output;
	private Tool tool;
	
	private String tname, cmd, argumentes;
	
	public Compiler(ToolHandler tools, OutputHandler outputs){
		this.tools = tools;
		this.outputs = outputs;
		outputsArray = outputs.getOutputs();
	}
	
	public void run(){
		//Nacheinander die Outputs abarbeiten
		Iterator iterator = outputsArray.iterator();
		while(iterator.hasNext()){
			// Daten auslesen
			output = (Output)iterator.next();
			name = output.name;
			toolname = output.toolname;
			arguments = output.arguments;
			
			//Toolname zu Objekt
			tool = tools.getTool(toolname);
			tname = tool.getName();
			cmd = tool.getCommand();
			
			// Argumente konvertieren
			argumentes = "";		
			Iterator iteratorB = arguments.iterator();
			while(iteratorB.hasNext()){
				argumentes += (String)iteratorB.next() + " ";
			}
			// Aufruf vornehmen
			System.out.println("=========== Aufuehrung ===============");
			System.out.println("Output: " + name + " " + toolname + " Argumente " + argumentes + " " + "Tool: " + cmd);
			System.out.println("=========== Rueckgabe ===============");
			this.process(cmd,argumentes);
			System.out.println("=========== Aufuehrung ENDE ===============");
		}
	}
	
	public void process(String cmd, String cmdArguments){
		try{	
		File scriptFile = new File("D:/Hello.java");	
		ProcessBuilder processBuilder = new ProcessBuilder("cmd","/c",cmd);
		processBuilder.directory(scriptFile.getParentFile());
		Process process = processBuilder.start();
		Scanner scanner = new Scanner(process.getInputStream());
		 while(scanner.hasNextLine()){
			 System.out.println(scanner.nextLine());
		 	
		 }
		
		 scanner.close();
	
		System.out.println(process.waitFor());
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
}
```

Ich hatte noch einiger andere Versuche mit verschiedenen Parametern an den ProcessBuilder, die aktuelle Version hört einfach nicht auf zu laufen, weil javac wohlmöglich seine Hilfe Seite ausgibt, diese wird aber auch nicht auf der Konsole ausgegeben.

Bevor ich es vergesse.... natürlich kann man java Files auch anders in Java kompelieren, aber wie eingangs schon erwähnt muss es nicht zwingend eine Java File sein die kompeliert werden soll.

Für jede Idee bin ich dankbar.
MfG
Duke


----------



## zeja (10. August 2007)

Ich hoffe das XML mit dem du testest hat nicht so kaputte Pfade...

Auf jeden Fall ignorierst du die Argument die du mit übergibst. Dann ist es auch kein Wunder dass nichts ausgeführt wird. Weiterhin macht es keinen Sinn die Argumente zu einem String zu konkatenieren, damit kommt der ProcessBuilder nicht klar. Und du kannst den Compiler auch direkt ausführen ohne den Umweg über "cmd".


```
private static void execute(Output out, Tool tool) throws IOException,
			InterruptedException {

		String[] array = out.getArguments( ).toArray(new String[0]);
		
		String[] commandArray = new String[array.length + 1];
		commandArray[0] = new File(tool.getCommand( )).getAbsolutePath( );
		System.arraycopy(array, 0, commandArray, 1, array.length);

		ProcessBuilder builder = new ProcessBuilder(commandArray);
		File outDir = new File("D:/test");
		outDir.mkdir( );
		builder.directory(outDir);
		Process p = builder.start( );

		System.out.println("Errors:");
		Scanner s = new Scanner(p.getErrorStream( )).useDelimiter("\\Z");
		if (s.hasNext( )) {
			System.out.println(s.next( ));
		}
		s.close( );
		
		System.out.println("Output:");
		Scanner s2 = new Scanner(p.getInputStream( )).useDelimiter("\\Z");
		if (s2.hasNext( )) {
			System.out.println(s2.next( ));
		}
		s2.close( );
		
		System.out.println(p.waitFor( ));

	}
```


----------



## Dukeatcoding (24. August 2007)

Danke für die Antwort hatte leider keine Zet mich eher wieder drum zu kümmern.

Ich hab gerade noch nen bissel Probelme mit dem toArray aus Zeile 4, werd erstma selber versuchen da noch etwas rumzufrickeln


----------

