2010-09-04 21 views
18

Tengo una anotación personalizada y su procesador es & procesador. ¿Cómo puedo configurar mi fichero de construcción Ant tal que:Java 6 configuración de procesamiento de anotación con Ant

  1. El procesador de anotación se aplica sobre las clases anotadas y genera archivos de origen en el interior "gen" carpeta

  2. Los archivos fuente generados (de procesamiento de anotación) podría ser utilizado por otros archivos fuente en el proyecto.

Respuesta

11

Esto no es bonito, pero es lo que hago. (Fuentes javac ant taskjavac man page) Usando el atributo compilerarg puedo pasar los argumentos relacionados con el procesamiento de la anotación que no son directamente compatibles con la tarea javac ant.

<javac srcdir="${src}" destdir="${classes}" ... > 
    .... 
    <compilerarg line="-processorpath ${processorpath}"/> 
    <compilerarg line="-processor ${processor}"/> 
    <compilerarg line="-s ${whereToPutGeneratedClassFiles}"/> 
</javac> 

Yo no uso el APT tool debido a que la documentación indica

Be advised that the Apt tool does appear to be an unstable part of the JDK framework, so may change radically in future versions. In particular it is likely to be obsolete in JDK 6, which can run annotation processors as part of javac.

Si realmente no se preocupan por args del compilador, puede sacudir sus procesadores de anotación como esto

<jar destfile="${annotationprocessorjar}" ... > 
    ... 
    <service type="javax.annotation.processing.Processor" provider="${your.annotation.processor.fully.qualified.name}"/> 
</jar> 

A continuación, puede hacer

<javac ... make sure ${annotationprocessorjar} is in classpath> 
</javac> 
+0

Intenté en ambos sentidos pero cada vez el objetivo ant "completado en 0" y realmente no generaba el archivo o incluso imprimía mis instrucciones de depuración. Curiosamente, cuando lo ejecuté desde la línea de comandos, recibí el error de javac Annotation Processor mypackage.MyProcessor no encontrado. ¿Me estoy perdiendo de algo? – user18943

+0

Algo obviamente está mal. ¿Qué versión de javac usa? ¿Mipackage.MyProcessor se extiende en desuso 1,5 (http://download.oracle.com/javase/1.5.0/docs/guide/apt/mirror/com/sun/mirror/apt/AnnotationProcessor.html) o el actual 1.6 (http : //download-llnw.oracle.com/javase/6/docs/api/javax/annotation/processing/Processor.html)? – emory

+0

Oye, ese era el eslabón perdido. Estaba usando las API espejo de javac v.1.6 y jdk1.5. Lo encontré escrito en todas partes que la herramienta apt está en desuso, pero no descubrió que la API reflejada también estaba en desuso. Eso es incómodo. De todos modos, solo funciona cuando compilo el procesador y luego compilo otras fuentes que proporcionan argumentos de proceso y de ruta de proceso. Todavía no hará nada si saco el procesador y lo uso en classpath (ya he dado el archivo javax.annotation.processing.Processor que tiene mypackage.MyProcessor en META-INF/services). – user18943

0

se puede echar un vistazo a la annotation processing tool , que compila automáticamente los sourcefiles generados

// // EDITAR En respuesta a su comentario:

Se puede utilizar en combinación con apt the apt ant task

Pero a partir de jdk6 la herramienta javac proporciona direct support for annotation processing, por lo que debería poder usar the javac ant task con el compilador a ttribute especificado como "javac1.6"

+0

No estoy buscando para ello. Estoy buscando la configuración Ant build (que está escrita muy claramente en mi pregunta). – user18943

1

Así es como lo hice en Eclipse/ant:

<javac destdir="bin" 
    debug="true" 
    debuglevel="${debuglevel}" 
    compiler="javac1.6" 
    srcdir="${src}"> 
     <include name="**/*.java"/> <!-- I just do it this way --> 
<classpath refid="classpath_ref_id"/> 
<compilerarg value="-processor" /> 
<compilerarg value="${processor}" /> 
<compilerarg value="-s" /> 
<compilerarg value="${gen_src_target}" /> 
</javac> 

Notas

  • El camino procesador está incluido en el * classpath_ref_id *
  • ejecutar el procesador de antes que compilación el código real (con o sin el código generado).
2

Encontré algunos de los otros ejemplos ligeramente confusos debido a que algunos de los bits clave son variables inexplicadas.Esto es lo que terminé con:

para construir el frasco procesador:

<target name="build-aux"> 
    <mkdir dir="${build.dir}" /> 
    <mkdir dir="${build.classes}" /> 
    <javac destdir="${build.classes}" source="1.6" target="1.6"> 
     <src path="${src.java}" /> 
     <include name="com/acme/cli/Program.java" /> 
     <include name="com/acme/cli/ProgramProcessor.java" /> 
    </javac> 

    <jar jarfile="acme-aux.jar" update="true"> 
     <manifest> 
      <attribute name="Main-Class" value="${main.class}" /> 
      <attribute name="Implementation-Title" value="acme-aux" /> 
      <attribute name="Implementation-Version" value="${version}" /> 
      <attribute name="Implementation-Vendor" value="ACME, Inc" /> 
      <attribute name="Built-By" value="${user.name}" /> 
      <attribute name="Build-Date" value="${TODAY}" /> 
     </manifest> 
     <fileset dir="${build.classes}"> 
      <!-- the annotation --> 
      <include name="com/acme/cli/Program.class" /> 
      <!-- the annotation processor --> 
      <include name="com/acme/cli/ProgramProcessor.class" /> 
     </fileset> 
     <service type="javax.annotation.processing.Processor" 
      provider="com.acme.cli.ProgramProcessor" /> 
    </jar> 
</target> 

a continuación para compilar el código y ejecute el procesador:

<target name="compile" depends="generate,build-aux"> 
    <mkdir dir="${build.dir}" /> 
    <mkdir dir="${build.classes}" /> 
    <javac destdir="${build.classes}" source="1.6" target="1.6"> 
     <src path="${src.java}" /> 
     <include name="com/acme/**/*.java" /> 
     <!-- ensure that "acme-aux.jar" is in this classpath --> 
     <classpath refid="compile.class.path"/> 
     <!-- pass option to annotation processor --> 
     <compilerarg value="-Aacme.version=${version}" /> 
    </javac> 
</target> 
Cuestiones relacionadas