J'essaye d'écrire un script Ant qui télécharge les bibliothèques (ivy et svnant) de notre dépôt et les utilise comme taskdef du même script de construction. Il fonctionne si toutes les bibliothèques sont présents ou sont tous absents, mais si une bibliothèque secondaire est nécessaire (comme svnClientAdapter), puis je reçois l'erreur:Chargement des bibliothèques ant après téléchargement
jar:file:/home/reillym/.ant/lib/svnant.jar!/org/tigris/subversion/svnant/svnantlib.xml:5: taskdef A class needed by class org.tigris.subversion.svnant.SvnTask cannot be found: org/tigris/subversion/svnclientadapter/SVNClientException
Dans les mots d'ordre, tout va bien, si la bibliothèque primaire ne ou n'existe pas; mais si les bibliothèques primaires existent et qu'une des bibliothèques de dépendances n'existe pas, alors j'obtiens un échec. Si rien d'autre n'est changé, un second appel réussira.
J'ai essayé d'appeler les tâches de détection/téléchargement d'une tâche et d'une classe avec le même résultat. Le code que j'ai est:
<target name="svn-info" depends="load.subverion">
<svn><wcVersion path="${basedir}"/></svn>
</target>
<target name="load.subversion" depends="download.antlib-svn">
<taskdef resource="org/tigris/subversion/svnant/svnantlib.xml">
<!-- needed in case one of libraries was missing from ant's classpath -->
<classpath>
<pathelement location="${user.home}/.ant/lib/svnClientAdapter.jar"/>
<pathelement location="${user.home}/.ant/lib/svnant.jar"/>
<pathelement location="${user.home}/.ant/lib/svnjavahl.jar"/>
</classpath>
</taskdef>
<target name="download.antlib-svn" depends="retrieve.antlib-svn">
<!-- ant target="retrieve.antlib-svn" inheritAll="false"/ -->
</target>
<target name="retrieve.antlib-svn">
<get dest="${user.home}/.ant/lib/svnClientAdapter.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnClientAdapter.jar"/>
<get dest="${user.home}/.ant/lib/svnant.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnant.jar"/>
<get dest="${user.home}/.ant/lib/svnjavahl.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnjavahl.jar"/>
</target>
Si seulement svnant.jar est manquant, tout fonctionne comme prévu. Cela échoue sur une erreur "classe introuvable" sur la tâche taskdef si svnClientAdapter.jar est manquant et sur un "NoClassDefFoundError" lorsque vous essayez d'utiliser la tâche. Comme mentionné, j'ai essayé où la cible retrieve.antlib-svn est appelée en tant que dépendance, en tant que tâche «ant» et en tant que tâche «java» (avec fork).
Ant 1.7.0 avec JDK 1.6.0_11 sous Ubuntu 10.10 et RedHat ELS6. Le code de détection/d'évitement a été supprimé par souci de concision. Avec le débogage activé, la seule différence entre l'invocation de travail et l'échec est que le jar manquant est inclus dans le chemin de classe de ant, que j'essaie de remplacer dans la tâche taskdef.
Cela ne me dérangerait pas de lancer un nouvel appel de fourmi de niveau supérieur, mais ivy.project.invoked-targets ne semble pas être disponible en 1.7.0 et je n'ai pas trouvé une autre façon d'appeler fourmi avec le mêmes cibles de départ.