2012-10-12 236 views
8

La pregunta parece ser obvia, pero la implementación es bastante difícil para mí.¿Cómo compilar el procesador de anotación con Ant?

Mi objetivo es escribir Ant script de construcción a compilar algunas clases que requieren otras clases generadas por procesador de anotación. Tengo anotaciones personalizadas y su implementación de procesador (heredada de la clase AbstractProcessor).

Como entiendo que tienen que:

  1. Compila el procesador de anotación
  2. ejecutar el compilador sobre algunas clases anotadas para generar los nuevos.
  3. compilar el clases que requieren clases

El código (paso 1 & 2) generado:


<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> 

En realidad, la primera tarea es realizar buenas y compila el. archivo de clase para la implementación del procesador de anotación. Se está deteniendo en la 2da tarea.

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

¿Qué estoy haciendo mal? Tal vez debería poner la clase de procesador de anotación en un .jar? O proporcione un nombre de archivo con extensión .class como argumento -processorpath? He intentado varias opciones, pero nada ayuda ..


Notas:

estoy usando tarea ant javac en lugar de uno, porque aptdocumentation reclamaciones que herramienta apt, así como com.sun.mirror API está en desuso. También he consultado este question, pero no hay información sobre cómo compilar el procesador de la manera correcta.

que estoy usando:

  • Java 1.6
  • Ant 1.8.2

Respuesta

4

Mi método usual es:

  • empacar la anotación junto con el procesador de anotación en su propio jar
  • registra el procesador de anotación a través de ME TA-INF/services en ese jar

Luego, donde sea que tenga una dependencia en sus anotaciones, el procesador de anotación se recogerá automáticamente sin ninguna configuración adicional.

+0

Es posible hacer lo mismo sin colocar el procesador de anotación (más la anotación) en el.¿tarro? – ivstas

+0

Bueno, al menos el procesador de anotaciones normalmente debe estar en un contenedor diferente al de las clases, que se anotan con su anotación, ya que el proceso de anotación debe deshabilitarse al compilar procesadores de anotación. Puede tener las anotaciones y los procesadores de anotación en dos jarras separadas, pero luego debe declarar una dependencia en ambos para procesar las anotaciones, lo cual es menos cómodo en la mayoría de los casos, creo. – Puce

+0

Para ser claros, no me refiero a que el contenedor solo contenga anotaciones y procesadores de anotaciones, pero no debe contener ninguna clase que deba procesarse con un procesador de anotaciones. – Puce

Cuestiones relacionadas