2012-10-12 7 views
8

La domanda sembra ovvia, ma l'implementazione è piuttosto difficile per me.Come compilare il processore di annotazione con Ant?

Il mio obiettivo è quello di scrivere script di build Ant a compilare alcune classi che richiedono un altro classi generate dal processore annotazione. Ho annotazioni personalizzate ed è l'implementazione del processore (ereditata dalla classe AbstractProcessor).

A quanto ho capito ho bisogno di:

  1. Compilare l'Annotazione processore
  2. eseguire il compilatore su alcune classi annotate per generare quelle nuove.
  3. compila la classi che richiedono classi

Il codice (passaggio 1 & 2) generati:


<target name="compileAnnotationProcessor">   
    <javac destdir="${OUTPUT_DIR}" 
      debug="true" 
      failonerror="true" 
      includeantruntime="false" 
      classpath="${java.class.path}"> 
     <src> 
      <pathelement path="${PROJECT_DIR}/tools/src"/> 
     </src> 

     <include name="/path/to/annotation/processor/package/**"/> 
    </javac> 
</target> 

<target name="generateFilesWithAPT" depends="compileAnnotationProcessor"> 
    <javac destdir="${OUTPUT_DIR}" 
      includeantruntime="false" 
      listfiles="false" 
      fork="true" 
      debug="true" 
      verbose="true"> 
     <src> 
      <pathelement path="${PROJECT_DIR}/common/src/"/> 
     </src> 
     <include name="/path/to/files/to/compile/**"/> 
     <classpath> 
      <pathelement path="${OUTPUT_DIR}"/> 
      <pathelement path="${java.class.path}"/> 
     </classpath> 

     <compilerarg line="-proc:only"/> 
     <compilerarg line="-processorpath ${OUTPUT_DIR}/path/to/annotation/processor/package/annProcessorImplement"/> 
    </javac> 
</target> 

In realtà, il primo compito sta eseguendo bene e compila il. file di classe per l'implementazione del processore Annotation. Si sta fermando al 2 ° compito.

Ant dice: Annotation processing without compilation requested but no processors were found.

Che cosa sto facendo di sbagliato? Forse dovrei mettere la classe del processore di annotazione in un .jar? Oppure fornire un nome file con estensione .class come argomento -processorpath? Ho provato diverse opzioni, ma niente aiuta ..


Note:

che sto usando formica javac compito invece di apt uno perché documentation affermazioni che strumento apt così come com.sun.mirror API è deprecato. Ho anche guardato attraverso questo question, ma non ci sono informazioni su come compilare il processore nel modo giusto.

sto usando:

  • Java 1.6
  • Ant 1.8.2

risposta

4

Il mio approccio abituale è:

  • imballare l'annotazione insieme con il processore annotazione il suo barattolo
  • registra il processore di annotazione tramite ME TA-INF/servizi in quel barattolo

Quindi, ovunque si abbia una dipendenza dalle annotazioni, il processore di annotazione verrà prelevato automaticamente senza alcuna configurazione aggiuntiva.

+0

E 'possibile fare lo stesso senza posizionare il processore di annotazione (più l'annotazione) nel.vaso? – ivstas

+0

Almeno il processore di annotazione di solito dovrebbe trovarsi in un vaso diverso rispetto alle classi, che sono annotate con la propria annotazione, poiché l'elaborazione delle annotazioni deve essere disabilitata durante la compilazione dei processori di annotazione. Puoi avere le annotazioni e i processori di annotazione in due vasi separati, ma devi dichiarare una dipendenza da entrambi per elaborare le annotazioni, il che è meno comodo nella maggior parte dei casi, penso. – Puce

+0

Per essere chiari, non intendo che il jar debba contenere solo annotazioni e processori di annotazione, ma non dovrebbe contenere alcuna classe che deve essere elaborata da un processore di annotazione. – Puce