2010-05-13 11 views
4

Lors de mon travail, nous utilisons AspectJ dans certains de nos projets Java. Pour que cela fonctionne avec les builds ant, nous avons placé aspectjtools.jar dans ant/lib /.Comment remplacer la tâche ant stockée dans le répertoire ant lib

Je travaille actuellement sur un projet Java particulier et j'ai besoin d'utiliser une version plus récente d'aspectJ. Je ne veux pas que tous ceux qui utilisent le projet mettent à jour leur copie locale de aspectjtools.jar. Au lieu de cela, j'ai essayé d'ajouter le plus récent aspectjtools.jar au répertoire lib du projet et d'ajouter la ligne suivante à build.xml.

<taskdef 
    resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties" 
    classpath="./lib/aspectjtools.jar" /> 

Cependant, cela ne fonctionne pas comme je l'espérais que les charges ANT classloader pots de fourmi/lib/de préférence à la jarre je précise dans le classpath taskdef.

Existe-t-il un moyen de forcer Ant à choisir le pot vérifié dans mon projet à la place?

+0

J'ai essayé d'utiliser Jarjar remballer aspectj dans un package différent, mais cela semble avoir brisé aspectj et se sent comme un piratage géant donc je ne poursuis pas cette approche plus loin. – mchr

+0

Jusqu'ici je conclus qu'il n'y a aucun moyen de forcer la fourmi à choisir le pot vérifié dans mon projet à la place. Cela ressemble à un choix de conception étrange car je m'attendais à ce que le fichier build.xml pour un projet particulier soit le meilleur endroit pour choisir la version d'une tâche à utiliser. – mchr

+0

https://issues.apache.org/bugzilla/show_bug.cgi?id=6606 - Semble être un bug de longue date. Je suis en train de lire le fil de commentaires maintenant. – mchr

Répondre

3

La réponse ultime à ma question est non. Il est actuellement impossible pour ANT d'utiliser un jar de tâche d'un projet de préférence à un jar de tâche dans le répertoire ANT lib.

3

ne pouvez-vous pas simplement mettre à jour la cible de compilation iajc pour utiliser le nouveau jar sur le classpath?

Il n'est pas possible de forcer le chargeur de classe à préférer un fichier jar donné à un autre. Si vous devez vous connecter à plusieurs versions de la même classe, vous devriez considérer OSGI.

La solution la plus simple consistera simplement à utiliser les bibliothèques du projet ou un référentiel Maven/Ivy et à ignorer les bibliothèques de votre dossier ant global.

Un exemple:

<taskdef 
    resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"> 
     <classpath> 
     <pathelement location="${basedir.dir}/lib/aspectjtools.jar"/> 
     </classpath> 
</taskdef> 

<target name="compile" > 
    <iajc outjar="demo.jar"> 
     <sourceroots> 
      <pathelement location=”src” /> 
     </sourceroots> 
     <aspectpath> 
      <pathelement 
       location="aspects_to_be_weaved_with_classes_in_sourceroots.jar" /> 
     </aspectpath> 
     <classpath> 
      <pathelement location="${basedir}/lib/aspectjrt.jar"/> 
     </classpath> 
    </iajc> 
    </target> 

Mise à jour: Vous devez également utiliser une autre Ant. Si vous utilisez Eclipse, essayez celui fourni directement à partir de la vue Ant.

Vous avez également une autre option, mais c'est un peu plus difficile. C'est utiliser le tissage de temps de chargement d'AspectJ à la place. Si vous optez pour cette option, vous pouvez compiler avec une tâche de compilation ordinaire, mais vous devez faire le tissage avec un agent JVM au démarrage. Vous pouvez en savoir plus à ce sujet here.

J'espère que cela aide!

+0

Merci pour la réponse. Je vais tester si cela fonctionne demain. – mchr

+1

Cela ne résout pas mon problème. L'élément taskdef vous permet de spécifier un chemin de classe mais mon test montre que ce classpath est inséré à la fin du chemin de classe existant.Cela signifie que ANT utilisera toujours aspectjtools.jar dans le répertoire ant/lib/de préférence à toute version spécifiée dans le classpath taskdef. – mchr

+1

Merci pour la mise à jour - Je peux voir que l'utilisation d'une autre copie de ant résoudrait mon problème, mais seulement en contournant le problème. Le tissage de temps de chargement est une autre solution valable mais se sent particulièrement compliqué. Est-il vraiment déraisonnable pour ANT de fournir un mécanisme permettant à un projet de forcer quelle version d'une tâche est utilisée? – mchr

1

Ceci est possible. Vous devez utiliser cette tâche supplémentaire pour créer une nouvelle classe chargeur

http://enitsys.sourceforge.net/ant-classloadertask/

<!--Append the dependent jars to the classpath so we don't have to install them in the ant directory--> 
    <taskdef resource="net/jtools/classloadertask/antlib.xml" 
      classpath="${basedir.dir}/lib/ant-classloadertask.jar"/> 

    <classloader loader="ant.aspectj.loader" parentloader="project"> 
     <classpath> 
      <pathelement location="${basedir.dir}/lib/aspectjtools.jar"/> 
      <pathelement location="${basedir.dir}/lib/ant-classloadertask.jar"/> 
     </classpath> 
     <antparameters parentfirst="false"/> 
     <handler loader="org.apache.tools.ant.AntClassLoader" adapter="org.apache.tools.ant.taskdefs.classloader.adapter.AntClassLoaderAdapter"/> 
    </classloader> 

    <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties" 
      classpath="${basedir.dir}/lib/aspectjtools.jar"" 
      loaderref="ant.aspectj.loader"/>