Mon programme reçoit des arguments en ligne de commande. Comment puis-je le passer quand j'utilise Ant?
Réponses
Trop de publicités?L'extension de Richard Cook's réponse.
Voici l' ant
de la tâche à exécuter n'importe quel programme (y compris, mais non limité à des programmes Java):
<target name="run">
<exec executable="name-of-executable">
<arg value="${arg0}"/>
<arg value="${arg1}"/>
</exec>
</target>
Voici la tâche à exécuter un programme Java à partir d'un .jar
le fichier:
<target name="run-java">
<java executable="path for jar">
<arg value="${arg0}"/>
<arg value="${arg1}"/>
</java>
</target>
Vous pouvez invoquer soit à partir de la ligne de commande comme ceci:
ant -Darg0=Hello -Darg1=World run
Assurez-vous d'utiliser l' -Darg
de la syntaxe; si vous avez exécuté ce:
ant run arg0 arg1
ensuite, ant
serait d'essayer d'exécuter des cibles arg0
et arg1
.
Si vous ne souhaitez pas gérer des propriétés distinctes pour chaque argument possible, je suggère que vous souhaitez 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 unless
de l'attribut et de l'intérieur de faire:
<input message="Type the desired command line arguments:" addProperty="args"/>
Mettre tous ensemble 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 invite pour les arguments de ligne de commande, tandis que le second ne sera pas.
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 à l'aide de la tâche <exec>
, vous pouvez effectuer les opérations suivantes:
<exec executable="name-of-executable">
<arg value="arg0"/>
<arg value="arg1"/>
</exec>
Ce que j'ai fait en fin de compte, c'est de faire un fichier de commandes pour extraire le chemin de la fourmi fichier, puis 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 "$@"
Il n'est plus de la croix-plate-forme, mais au moins il est relativement facile à utiliser, et l'on pourrait en fournir un .fichier bat qui fait la même chose que le run.sh. C'est un très court script de commandes. Ce n'est pas comme la migration de l'ensemble de la construction à la plate-forme des fichiers de commandes spécifiques.
Je pense que c'est une honte, il n'y a pas une option dans ant par lequel vous pourriez faire quelque chose comme:
ant -- arg1 arg2 arg3
mpirun utilise ce type de syntaxe; ssh peut également utiliser cette syntaxe je pense.