2010-11-24 138 views
0

Je développe un script ant qui appelle un autre script ant en utilisant la tâche <ant>. Ce script ant est un installateur un produit Java et doit être utilisé par nos clients, qui auront installé ant.Existe-t-il un moyen d'appeler la cible ant 'ant' avec l'option '-lib'

Le script appelé utilise la tâche antlr <antlr:ant-antlr3>. Pour ce faire, je dois placer le fichier ant-antlr3.jar dans le répertoire ant lib, ainsi qu'ajouter antlr-3.2.jar au classpath.

Mais je ne veux pas avoir cette dépendance d'avoir le fichier ant-antl3.jar dans la propre version installée de la fourmi du client. Existe-t-il un moyen de fournir l'équivalent de l'option '-lib' de la ligne de commande de ant pour spécifier d'autres chemins pour les bocaux à ajouter à antlib en utilisant la tâche <ant> elle-même? J'ai regardé les documents en ligne et il ne semble pas y avoir de solution.

Merci

Répondre

1

je crois que la façon acceptée de le faire est de configurer manuellement votre classpath dans le fichier de construction plutôt que de manière implicite, y compris via le répertoire global ant lib. à savoir

<path id="master-classpath"> 
    <fileset dir="${lib}" /> 
    <fileset file="${findbugs-base}/lib/annotations.jar" /> 
    <pathelement location="${build-classes}" /> 
</path> 

Vous pouvez ensuite utiliser cet élément de chemin dans une tâche qui peut accepter args classpath tels que javac

<javac 
     destdir="${out}" 
     source="1.5" 
     target="1.5" 
     debug="true"> 
    <src path="${src}" /> 
    <classpath refid="master-classpath" /> 
</javac> 

De cette façon, la fourmi globale mis en place n'est pas une dépendance, et vous pouvez spécifiez les fichiers dont vous pourriez avoir besoin pour toute construction, aussi précisément que nécessaire (jusqu'à un appel ou une cible donnée). De toute évidence, tout cela doit être effectué dans le fichier de construction que vous appelez du fichier de construction des clients. De cette façon, lorsque vous appelez le vôtre, le classpath sera configuré exactement comme vous le désirez.

Une autre possibilité beaucoup moins idiomatique serait de débourser littéralement avec le Exec Task et d'appeler ainsi la fourmi. De toute évidence, avec la fourniture de la tâche Ant, les développeurs de fourmi ne vous recommandons pas de le faire. C'est une option, néanmoins.

+0

L'élément '' est pris en charge par l'élément '' . J'ai essayé de passer le classpath en utilisant des refids, c'est-à-dire, j'ai installé le chemin dans mon dossier de construction, et ai passé ceci à l'autre dossier de construction comme refid. Mais ceci n'est pas repris par la tâche antlr def, je pense que les jars utilisés pour taskdef doivent être inclus dans la librairie ant lib. – Neil

+0

La méthode de tâche exec fonctionne pour cela, merci. – Neil

1

La réponse de Tim donne la majeure partie de l'histoire, mais pour exécuter Ant et définir les options JVM, vous devez l'appeler via la tâche java.

Il est un exemple de running this way dans les Ant docs, ici légèrement modifié pour inclure -lib:

<java 
     classname="org.apache.tools.ant.launch.Launcher" 
     fork="true" 
     failonerror="true" 
     dir="${sub.builddir}" 
     timeout="4000000" 
     taskname="startAnt" 
> 
    <classpath> 
     <pathelement location="${ant.home}/lib/ant-launcher.jar"/> 
    </classpath> 
    <arg value="-lib"/> 
    <arg value="${path.to.your.antlr.jar}"/> 
    <arg value="-buildfile"/> 
    <arg file="${sub.buildfile}"/> 
    <arg value="${sub.target}"/> 
</java> 
+0

Vous avez le genre de travail ci-dessus, c'est-à-dire passer la bibliothèque personnalisée à ANT de cette façon, mais en ayant d'autres erreurs classpath. Décidé que le moyen le plus simple serait de fournir une version de ANT avec des librairies personnalisées etc. avec le programme d'installation au client, et qu'ils l'exécutent au lieu de posséder. Merci pour l'aide. – Neil