2011-05-25 2 views
1

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.

Répondre

1

Cela ne fonctionnera pas sans problème: cela a à voir avec le fait que les classloaders Java fonctionnent récursivement et qu'ils résolvent les dépendances, pas Ant lui-même.

Je suis désolé pour vous, je pense que ce n'est pas réalisable sans développer vous-même une extension Ant, et je n'ai pas la moindre idée de la façon de le faire.

Questions connexes