2010-12-03 14 views
19
<target name="CheckState"> 
    <exec executable="${App.path}"/> 
</target> 

Dans cette tâche, l'application exécutable renverra une valeur int qui indiquera l'état de mon application. Comment pourrais-je obtenir le retourné en valeur dans le script ant, je vais utiliser cette valeur pour déterminer certains comportementsComment obtenir une valeur de retour d'un script exec dans ant

Merci à l'avance

Répondre

28

Utilisez les resultproperty et failonerror attributs de la tâche exec, par exemple:

<target name="CheckState"> 
    <exec executable="${App.path}" 
      resultproperty="App.state" 
      failonerror="false"/> 
    <echo message="App state was: ${App.state}" /> 
</target> 

Je cite les tâches exec docs erreurs et des codes de retour:

Par défaut, le code de retour d'un exec est ignoré. Lorsque vous définissez failonerror = "true", tout retour échec de signalisation de code (spécifique au système d'exploitation) provoque l'échec de la génération. Alternativement, vous pouvez définir resultproperty au nom d'une propriété et l'affecter au code de résultat (sauf immutabilité, du cours ).

Si la tentative de lancer le programme échoue avec un code d'erreur dépendant OS, arrête alors la construction à moins failifexecutionfails est définie sur false. Vous pouvez l'utiliser pour exécuter un programme si existe, mais sinon ne rien faire.

Que signifient ces codes d'erreur? Eh bien, ils sont dépendants du système d'exploitation. Sous Windows , vous devez regarder la documentation ; le code d'erreur 2 signifie 'non tel programme', ce qui signifie généralement n'est pas sur le chemin. Chaque fois que vous voyez une telle erreur de toute tâche Ant, il est généralement pas un bug Ant, mais un certain problème de configuration sur votre machine.

+1

Merci. Cela fonctionne! J'ai essayé outputproperty et errorproperty, mais n'ai pas vu resultproperty. – Hyden

+0

Avez-vous défini la propriété fork sur true? Selon O'Reilly's _Ant: The Definitive Guide_, la propriété result ne fonctionnera que si failonerror est false _and_ fork est true. Cependant, fork semble être un attribut de l'élément Java. –

+1

@Jamil Je ne suis pas tout à fait. Une fourchette est implicite dans un exec - il n'est pas nécessaire de le spécifier. –

6

Voici une manière générique pour vérifier le résultat et afficher la sortie de l'exécution que si le processus retourne un code d'échec.

<property 
    name="my.project.tmp.exec.output" 
    value="${tmp.dir}/exec-output.txt"/> 

<target 
    name="my.project.my.task"> 
    <exec 
     executable="${App.path}" 
     output="${my.project.tmp.exec.output}" 
     resultproperty="my.project.my.task.result" 
     failonerror="false"/> 
    <loadfile 
     srcfile="${my.project.tmp.exec.output}" 
     property="my.project.my.task.output" 
    /> 
    <fail message="ERROR: ${my.project.my.task.output}"> 
     <condition> 
      <not> 
       <equals arg1="${my.project.my.task.result}" arg2="0"/> 
      </not> 
     </condition> 
    </fail> 
    <delete file="${my.project.tmp.exec.output}"/> 
</target>