2010-03-02 5 views
8

A titre expérimental, nous voulons construire nos produits en utilisant le compilateur java Eclipse (ecj-3.5.jar téléchargé depuis eclipse.org) sur la version d'exécution de Java 6 au lieu du JDK et si je comprends bien, il s'agit d'ajouter ce jar au chemin de classe ant et de définir la propriété build.compiler pour qu'elle pointe vers l'adaptateur.Spécification complète du compilateur Eclipse depuis _within_ build.xml

En incluant

<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" /> 

dans mon build.xml et invoquant fourmi avec un JRE, je reçois l'erreur attendue que l'adaptateur ne peut pas être trouvé, et en ajoutant ECJ-3.5.jar au classpath dans le Panneau Eclipse Je peux compiler mon code comme prévu. Je crois que la même fonctionnalité est disponible avec "-lib foo.jar" depuis la ligne de commande avec les fourmis modernes.

Maintenant, je veux spécifier dans build.xml que je veux ecj-3.5.jar sur mon classpath satisfaisant le même que ci-dessus. Nous pouvons déjà le faire avec des tâches de fourmi, donc je crois que c'est possible.

Donc la question est: Comment puis-je ajouter au classpath utilisé par javac pour localiser le compilateur seulement depuis build.xml?


Il semble que le ant4eclipse à venir 1.0 inclut le compilateur Eclipse (qui est ce que je voulais utiliser pour), donc par la mise à niveau que (de 0,5) devrait résoudre le problème que nous avons.


2010-09-24: Ant4Eclipse est toujours à M4 sans indication du moment où la libération se produira.


2011-12-01: Nous avons maintenant migré de ant à maven. Les scripts build.xml atteignent le mur de la complexité et une nouvelle approche s'impose. Quiconque a besoin de choisir quoi faire - ne pas aller dans le chemin ant4cllipse sauf pour les projets triviaux.


2012-11-30: Un an plus tard, l'expérience maven est encore bonne. Il y a beaucoup de bizarreries et de changements d'état d'esprit, mais la plupart ont du sens dans le contexte. Maven peut facilement spécifier le niveau du compilateur sur des projets individuels. Nous cherchons à utiliser ecj au lieu de javac (pour plusieurs raisons) mais javac fonctionne bien dans la plupart des cas.

Répondre

11

Une façon consiste à spécifier une référence à un composantdef lors de l'utilisation de javac.

<componentdef name="ecj" 
       classname="org.eclipse.jdt.core.JDTCompilerAdapter" 
       classpath="ecj-3.7.1.jar" /> 

<javac ....> 
    <ecj/> 
</javac> 

Une autre option est de définir build.compiler que vous avez ou l'attribut de compilateur pour javac puis spécifiez un compilerclasspath pour javac. C'est une structure de type chemin normal pour contenir le chemin de classe pour charger votre adaptateur de compilateur.

<javac compiler="org.eclipse.jdt.core.JDTCompilerAdapter" ....> 
    <compilerclasspath> 
    ... 
    </compilerclasspath> 
</javac> 

Voir la documentation javac task dans le manuel Ant pour plus de détails. Notez que ces deux solutions ne fonctionnent qu'à partir de Ant 1.8.

+0

Avec la fourmi livrée avec Eclipse 3.5 (probablement 1.7) j'obtiens "Problème: échec de création de tâche ou type de composant". Un autre message d'erreur est lié à classpath avec ant 1.8, mais j'apprécierais vraiment une solution qui fonctionne depuis Eclipse. –

+0

J'ai ajouté une autre option pour Ant 1.8 mais je ne vois pas comment vous pourriez le faire avec 1.7 – Mark

1

Lecture Running Ant via Java. Je pense que vous pouvez écrire un wrapper simple qui définira correctement un classpath et ajouter votre fichier jar au chemin de classe résultant.

Ici, je suis juste couper et coller l'échantillon à partir du lien ci-dessus avec l'ajout de la bibliothèque que vous êtes intéressé par la classpath:

<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"/> 
     <pathelement location="/path/to/ecj-3.5.jar"/> 
    </classpath> 
    <arg value="-buildfile"/> 
    <arg file="${sub.buildfile}"/> 
    <arg value="-Dthis=this"/> 
    <arg value="-Dthat=that"/> 
    <arg value="-Dbasedir=${sub.builddir}"/> 
    <arg value="-Dthe.other=the.other"/> 
    <arg value="${sub.target}"/> 
</java> 

Je pense que vous pouvez même réutiliser le même fichier de construction, donnez simplement une cible différente en tant que point d'entrée.

+0

Vous suggérez de relancer ant avec un classpath révisé. J'éviterais vraiment le pas de relance. –

Questions connexes