web-dev-qa-db-fra.com

Utilisez Ant pour exécuter le programme avec des arguments de ligne de commande.

Mon programme reçoit des arguments en ligne de commande. Comment puis-je le passer quand j'utilise Ant?

55
Victoria Seniuk

Étendre la réponse de Richard Cook .

Voici la tâche ant pour exécuter n’importe quel programme (y compris, sans toutefois s'y limiter, Java)):

<target name="run">
   <exec executable="name-of-executable">
      <arg value="${arg0}"/>
      <arg value="${arg1}"/>
   </exec>
</target>

Voici la tâche pour exécuter un programme Java à partir d'un .jar fichier:

<target name="run-Java">
   <Java jar="path for jar">
      <arg value="${arg0}"/>
      <arg value="${arg1}"/>
   </Java>
</target>

Vous pouvez appeler soit à partir de la ligne de commande comme ceci:

ant -Darg0=Hello -Darg1=World run

Assurez-vous d'utiliser le -Darg syntaxe; si vous avez couru ceci:

ant run arg0 arg1

alors ant essaierait de lancer les cibles arg0 et arg1.

71
emory

Si vous ne voulez pas gérer des propriétés distinctes pour chaque argument possible, je vous suggère d'utiliser:

<arg line="${args}"/>

Vous pouvez vérifier si la propriété n'est pas définie à l'aide d'une cible spécifique avec un attribut unless et à l'intérieur de:

<input message="Type the desired command line arguments:" addProperty="args"/>

Rassembler tout cela donne:

<target name="run" depends="compile, input-runargs" description="run the project">
  <!-- You can use exec here, depending on your needs -->
  <Java classname="Main">
    <arg line="${args}"/>
  </Java>
</target>
<target name="input-runargs" unless="args" description="prompts for command line arguments if necessary">
  <input addProperty="args" message="Type the desired command line arguments:"/>
</target>

Vous pouvez l'utiliser comme suit:

ant
ant run
ant run -Dargs='--help'

Les deux premières commandes demanderont les arguments de ligne de commande, contrairement à la dernière.

28
ofavre

Le seul mécanisme efficace pour transmettre des paramètres dans une construction consiste à utiliser les propriétés Java:

ant -Done=1 -Dtwo=2

L'exemple suivant montre comment vérifier et vérifier que les paramètres attendus ont été transmis au script.

<project name="check" default="build">

    <condition property="params.set">
        <and>
            <isset property="one"/>
            <isset property="two"/>
        </and>
    </condition>

    <target name="check">
        <fail unless="params.set">
        Must specify the parameters: one, two
        </fail>
    </target>

    <target name="build" depends="check">
        <echo>
        one = ${one}
        two = ${two}
        </echo>
    </target>

</project>
11
Mark O'Connor

Pouvez-vous être un peu plus précis sur ce que vous essayez de faire et comment vous essayez de le faire?

Si vous essayez d’appeler le programme en utilisant le <exec> tâche vous pourriez faire ce qui suit:

<exec executable="name-of-executable">
  <arg value="arg0"/>
  <arg value="arg1"/>
</exec>
4
Richard Cook

Ce que j'ai fait à la fin est de créer un fichier de commandes pour extraire le CLASSPATH du fichier ant, puis d'exécuter Java directement à l'aide de ceci:

Dans mon build.xml:

<target name="printclasspath">
    <pathconvert property="classpathProp" refid="project.class.path"/>
    <echo>${classpathProp}</echo>
</target>

Dans un autre script appelé 'run.sh':

export CLASSPATH=$(ant -q printclasspath | grep echo | cut -d \  -f 7):build
Java "$@"

Ce n'est plus multi-plateforme, mais au moins c'est relativement facile à utiliser, et on pourrait fournir un fichier .bat qui fait la même chose que run.sh. C'est un script batch très court. Ce n'est pas comme si vous migriez l'intégralité de la génération vers des fichiers de commandes spécifiques à la plate-forme.

Je pense que c'est dommage qu'il n'y ait pas une option dans fourmi qui vous permettrait de faire quelque chose comme:

ant -- arg1 arg2 arg3

mpirun utilise ce type de syntaxe; SSH peut également utiliser cette syntaxe, je pense.

0
Hugh Perkins