9
votes

Pourquoi Ant.Bat ne renvoie pas d'état d'erreur lorsqu'il est exécuté par programme?

Lorsque j'exécute une fourmi de la ligne de commande, si je reçois un échec, je reçois un statut de sortie non nul ($? sur UNIX,% ErrorLel%% sous Windows). Mais nous avons un programme Java qui exécute une fourmi (via ProcessBuilder), et lorsque Ant échoue, sous Windows, nous ne pouvons pas obtenir le statut de sortie.

Je viens de vérifier cela avec ce fichier de test de fourmis simple: p>

import java.io.*;

public class Run {
  public static void main(String[] args) throws IOException, InterruptedException {
    ProcessBuilder pb = new ProcessBuilder(args);
    Process p = pb.start();
    ProcThread stdout = new ProcThread(p.getInputStream(), System.out);
    ProcThread stderr = new ProcThread(p.getErrorStream(), System.err);
    stdout.start();
    stderr.start();
    int errorLevel = p.waitFor();
    stdout.join();
    stderr.join();
    IOException outE = stdout.getException();
    if (outE != null)
      throw(outE);
    IOException errE = stdout.getException();
    if (errE != null)
      throw(errE);
    System.exit(errorLevel);
  }

  static class ProcThread extends Thread {
    BufferedReader input;
    PrintStream out;
    IOException ex;

    ProcThread(InputStream is, PrintStream out) {
      input = new BufferedReader(new InputStreamReader(is));
      this.out = out;
    }

    @Override
    public void run() {
      String line;
      try {
        while ((line = input.readLine()) != null)
          out.println(line);
      } catch (IOException e) {
        setException(e);
      }
    }

    private void setException(IOException e) {
      this.ex = e;
    }

    public IOException getException() {
      return ex;
    }
  }
}


0 commentaires

8 Réponses :


1
votes

Avez-vous besoin d'exécuter une fourmi via son fichier .bat? C'est juste un programme Java, vous pouvez simplement exécuter à l'intérieur de la machine virtuelle en instanciant directement et en exécutant le temps d'exécution des fourmis. Regardez à l'intérieur de la fourmi, voyez quelle est sa classe principale et l'exécuter directement.


1 commentaires

Ant.Bat est complexe et l'exécution du programme Java directement est complexe correspondant. Je vois le même problème d'exécution d'Ant.bat d'un script de fourmis (non, ne demande pas). Je ne peux pas voir l'erreur d'erreur. Je ne veux pas livrer Ant2.bat dans l'environnement de mon constructeur, mais je vais si je dois le faire. Est-ce que quelqu'un sait pourquoi cela fonctionne? PS: Quel est le balisage de formatage de ce commentaire ???



0
votes

Il s'agit d'un problème de longue date pour les anciennes versions de fourmi sous Windows. Je crois que cela a été corrigé dans la version 1.7.0.

voir Ce bogue pour plus de détails et Cette discussion pour une approche pour y remédier.


1 commentaires

Je suis sur ant 1.7.1. Je viens d'essayer de courir avec le chemin complet pour m'assurer que je n'exécute pas une autre version de la fourmi. Même comportement: niveau d'erreur correct lorsqu'il est exécuté à partir d'une invite; erreur d'erreur incorrecte lorsqu'elle est exécutée à partir d'un programme.



2
votes

J'ai résolu ce problème en créant deux fichiers de lots supplémentaires (pas très agréable, mais ça marche):

contenu du fichier myant.bat : xxx

contenu du fichier ant2.bat : xxx

maintenant je peux appeler myant.bat en tant que processus de Java et je reçois la valeur de sortie correcte.

Désolé, je ne peux pas dire pourquoi cela fonctionne. C'est simplement le résultat d'un nombre de nombreux essais.


0 commentaires

0
votes

J'ai googlé à ce fil et trouvez la réponse à Tangens a presque résolu mon problème: la sortie codée est toujours 0 sous Windows à partir de ant.bat , même lorsque j'ai échoué intentionnellement une bande de fourmis; J'ai besoin d'obtenir le code de sortie d'un script de construction TFS, et il a montré que même le errorlevel%% est introuvable dans la construction TFS.

Cependant, je dois supprimer le / b à partir de Quitter Lignes, sinon, il me montre toujours toujours le code de sortie 0.


0 commentaires

7
votes

J'ai résolu ce problème en créant un fichier single single (un peu plus agréable que ce qui précède mais toujours mystérieux):

contenu du fichier myant.bat : xxx

cruciale, sans aucun code que ce soit après l'appel .


1 commentaires

+1 avait le même problème à essayer d'appeler la fourmi de PSKE. Cela corrigé mon problème.



2
votes

Un patch rapide ajoute ce qui suit à la fin du fichier ant.bat: xxx

Ce problème existe depuis longtemps et fixé récemment. Se référer à bug 41039 .

Il devrait être Prêt dans la version antenne 1.8.2 ou ultérieure.


0 commentaires

2
votes

Un autre problème - Si vous appelez ANT dans un fichier BAT et que vous êtes intéressé à enregistrer la valeur d'erreur d'erreur, vous devez garder l'appel à partir d'un bloc IF / else.

Par exemple, cela ne fonctionnera pas (. ..Dans le milieu d'une routine): p> xxx pré>

Vous devez sortir de l'appel comme suit (... placé à l'extérieur de cette routine): P>

if "%DUMP_ARGS%"=="no" (
    call :call_ant
)


0 commentaires

0
votes

J'ai résolu remplacer si errorLEVEL 1 avec si% errorLel%% neq 0 : xxx


0 commentaires