tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von zeja
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1544
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Dukeatcoding Dukeatcoding ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Beiträge
    47
    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.

    PHP-Code:
    <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.

    PHP-Code:
    import java.util.*;
    import java.io.*;

    public class 
    Compiler {
        private 
    ToolHandler tools;
        private 
    OutputHandler outputs;
        private 
    ArrayList<OutputoutputsArray;
        
        
    // Fuer run
        
    private String nametoolname;
        private 
    ArrayList arguments;
        private 
    Output output;
        private 
    Tool tool;
        
        private 
    String tnamecmdargumentes;
        
        public 
    Compiler(ToolHandler toolsOutputHandler 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 cmdString 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
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    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".

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    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( ));
     
        }
    Anime-Otaku bedankt sich. 

  3. #3
    Dukeatcoding Dukeatcoding ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Beiträge
    47
    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
     

Ähnliche Themen

  1. ProcessBuilder
    Von IroNHeinZ im Forum Java Grundlagen
    Antworten: 7
    Letzter Beitrag: 20.12.09, 14:59
  2. Probleme mit Processbuilder
    Von Daelrik im Forum Java
    Antworten: 4
    Letzter Beitrag: 30.09.06, 15:54
  3. 2 Probleme beim DataGrid. beim Löschen und Hinzufügen einer Zeile
    Von WaZZkeSS im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 18.06.06, 00:26
  4. Probleme beim Empfang von MMS beim Nokia 3510i
    Von Claas M im Forum Elektrotechnik
    Antworten: 1
    Letzter Beitrag: 25.08.04, 10:38
  5. Probleme beim mit datentypen beim erhöhen der Spalten nummer
    Von josefhader im Forum Visual Basic 6.0
    Antworten: 4
    Letzter Beitrag: 18.08.04, 14:53