2012-10-04 41 views
9

Tengo un procesador de anotación para una anotación de política de retención = FUENTE.Cómo depurar paso a paso el procesador de anotaciones durante la compilación?

No tengo idea de cómo depurarlo paso a paso.

  • He dado instrucciones de impresión, información registrador cuando corro mvn instalar, compilar o paquete o una hormiga javac, y veo sus sysouts en el registro de compilación.

  • Sin embargo, no tengo idea de cómo depurar paso a paso el procesador en Eclipse. Quiero decir, ¿cómo depurar paso-tiempo de compilación?

Respuesta

5

Usted tiene que invocar el compilador Java de Eclipse, usando una configuración de depuración (necesitará para crear la configuración manualmente, desde la "depuración Configuraciones ..." menú a elegir.

El " "La forma correcta de invocar el compilador Java bajo JDK 1.6 o superior es usar la interfaz JavaCompiler en javax.tools, que obtienes del ToolProvider (incluyo todos los enlaces porque hay una buena cantidad de documentación de clase/paquete que deberías leer).

La manera "rápida y sucia" (que debería funcionar, pero no garantizo) es invocar com.sun.tools.javac.Main.main(), pasando sus argumentos normales de línea de comandos. Para hacer esto, necesitará tools.jar en su classpath (se encuentra en $JAVA_HOME/lib).

+0

hola, leyendo esta respuesta como aceptada, me hace pensar que es una solución al problema. Por cierto, no entiendo qué significa "invocar el compilador de Java desde Eclipse, usando una configuración de depuración (necesitará crear la configuración manualmente, desde las" Configuraciones de depuración ".) ¿Puede explicar mejor, por favor? Gracias – Apperside

+0

Agregué tools.jar y el procesador jar a un proyecto existente. Luego usé la clase com.sun.tools.javac.Main como se sugirió. Creé una configuración de depuración de aplicaciones Java con tools.jar en classpath y argumentos javac como Argumentos del programa. Funcionó como un encanto, ¡gracias! – wbdarby

6

Una opción en los últimos tiempos es usar algo como http://github.com/google/compile-testing que le permite invocar el trabajo recopilatorio contra procesadores de anotación arbitrarias, que se pueden establecer puntos de ruptura, paso a paso, etc.

@Test public void testStuff() { 
    // Create a source file to process, or load one from disk. 
    JavaFileObject file = JavaFileObjects.fromSourceLines("test.Foo", 
    "package test;", 
    "", 
    "import bar.*;", 
    "", 
    "@MyAnnotation(blah=false)", 
    "interface TestInterface {", 
    " Bar someBar();", 
    "}", 

    // assert conditions following a compilation in the context of MyProcessor. 
    assert_().about(javaSource()).that(file) 
     .processedWith(new MyProcessor()) 
     .failsToCompile() 
     .withErrorContaining("some error message").in(file).onLine(5); 
} 

Esta prueba le espera recibirá un mensaje de error porque @MyAnnotation está incorrectamente declarado en la fuente de datos de prueba. Si esta afirmación falla, puede ejecutarla en modo de depuración en su IDE, establecer puntos de interrupción en MyProcessor y avanzar con un entorno de compilación completo activo durante la depuración.

para las pruebas unitarias métodos específicos dentro su procesador, también puede utilizar la llamada @Rule CompilationRule desde donde se puede obtener Elementos y clases de utilidad Tipos con el fin de probar la lógica específica de su compilador de una manera más aislada.

2

El procesamiento de anotaciones se produce durante la compilación, por lo que la depuración normal no funcionará. Si desea depurarlo en el contexto de su proyecto, puede usar la depuración remota de Eclipse, mientras tiene Gradle o Maven en modo de depuración. Luego puede poner puntos de interrupción en los archivos del procesador de anotaciones.

Ver Debugging an Annotation Processor in any project.

Descargo de responsabilidad: He escrito la publicación.

Cuestiones relacionadas