2010-07-01 5 views
4

Je voudrais savoir comment faire quelque chose dans ant (1) qui est équivalent à une règle makefile (4) particulière. La règle makefile (4) effectue les opérations suivantes: 1) démarre un processus qui ne se termine pas et qui écrit une ligne dans son flux de sortie standard; 2) lit la ligne du processus; 3) construit un fichier en utilisant la ligne; et 4) démarre un deuxième processus qui ne se termine pas en utilisant le fichier comme argument. Schématiquement, la règle makefile (4) estComment faire cette règle makefile (4) dans ant (1)?

program1 | while read arg; do \ 
    echo $$arg >file; \ 
    program2 file; \ 
done 

REMARQUE: "programme1" écrit une ligne; ni "programme1" ni "programme2" ne se termine.

Comment cela peut-il être fait dans ant (1)?

Répondre

1

Vous devriez pouvoir utiliser ProcessBuilder comme indiqué ci-dessous:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class PBTest { 

    public static void main(String[] args) { 
     ProcessBuilder pb = new ProcessBuilder("process1"); 
     pb.redirectErrorStream(true); 
     try { 
      Process p = pb.start(); 
      String s; 
      // read from the process's combined stdout & stderr 
      BufferedReader stdout = new BufferedReader (
       new InputStreamReader(p.getInputStream())); 
      if ((s = stdout.readLine()) != null) { 
       ProcessBuilder pb2 = new ProcessBuilder("process2", s); 
       pb2.start(); 
       ... 
      } 
      System.out.println("Exit value: " + p.waitFor()); 
      p.getInputStream().close(); 
      p.getOutputStream().close(); 
      p.getErrorStream().close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Ensuite, votre tâche java est assez simple:

<!-- Run the program --> 
<target name="run"> 
    <java classname="PBTest" fork="true"></java> 
</target> 

Addendum:

Je cherche une solution dans ant (1) plutôt que Java.

Vous pouvez utiliser n'importe quelle langue prise en charge par Apache BSF ou JSR 223 dans script task. Je ne vois pas un moyen d'utiliser les entrées et sorties standard directement, mais vous pouvez utiliser le loadfile task pour charger une propriété à partir d'un fichier. Voici un example qui obtient un numéro de version à partir d'un fichier source.

+0

@Pourquoi Litytestdata: Merci! – trashgod

+0

@Pourquoi Litytestdata Merci pour votre réponse, mais, comme ma question l'indique, je cherche une solution dans ant (1) plutôt que Java. –

+0

@Steve Emmerson: J'ai suggéré d'autres possibilités ci-dessus. – trashgod