En relisant ton code j'ai vue un autre problème : tu utilises la commande DOS START qui sépare le processus : comme il n'est plus lié c'est normal que waitFor() rende la main de suite...
En gros tu lances le shell (cmd.exe) qui lance ant en tâche de fond, et rend la main de suite...
Si tu n'as pas besoin du shell, il est préférable d'appeler directement l'exécutable en séparant les paramètres :
String[] command = { "ant", "-buildfile", "../dossier/bin/build.xml" ,"compil" };
Si veux utiliser le shell (par exemple pour gérer des variables d'environnement ou des caractères spéciaux comme les pipes ou redirection), tu dois alors avoir 3 paramètres, et le troisième doit contenir la totalité de la ligne de commande tel qu'elle devra être interprétée :
[code]String[] command = { "cmd.exe", "/C", "ant -buildfile ../dossier/bin/build.xml compil" };
Par contre cela ne change rien au fait que tu doives traiter les flux de sortie, surtout que Ant peut générer un grand nombre d'information...
Notes également que les chemins séparé par des "/" peuvent poser problèmes à certaines appli Windows...
Si tu ne veux pas t'embêter avec la gestion des flux, tu as plusieurs solutions :
- Utiliser un ProcessBuilder pour lancer le process, ce qui te permet de rediriger le flux d'erreur vers le flux de sortie standard, ce qui fait que tu n'a plus qu'un flux de sortie à traiter (je suppose que tu n'a rien à écrire dans le flux d'entrée, donc tu peux le fermer tout de suite).
- Tu peux également utiliser ma librairie Shell (voir mon billet blog), qui simplifie ce genre de traitement.
Par exemple tu as deux méthodes static permettant de faire des appels de base.
Ainsi pour appeler directement la commande :
int result = Shell.execute("ant", "-buildfile", "../dossier/bin/build.xml" ,"compil");
Ou pour interpréter une ligne de commande via le shell système (cmd.exe ou command.com selon les Windows, /bin/sh sur les autres systèmes) :
int result = Shell.system("ant -buildfile ../dossier/bin/build.xml compil");
Par défaut le flux d'entré est fermé, et les flux de sorties sont reportés respectivement sur System.out et System.err...
Tu peux changer cela en utilisant une instance de la classe Shell :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| // L'instance qui gèrera les commandes :
Shell shell = new Shell();
// Le buffer qui contiendra la sortie standard :
StringBuilder stdout = new StringBuilder();
// Le buffer qui contiendra la sortie d'erreur :
StringBuilder stderr = new StringBuilder();
// création de la commande (on utilisera exec() pour appeler directement une programme) :
int result = shell.command("ant -buildfile ../dossier/bin/build.xml compil")
.output(stdout) // On redirige la sortie standard dans un StringBuilder
.error(stderr) // On redirige la sortie d'erreur dans un StringBuilder
.consume(); // On lance la commande en traitant les flux |
a++
Partager