Mon programme reçoit des arguments en ligne de commande. Comment puis-je le passer quand j'utilise Ant?
É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
.
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.
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>
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>
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.