2011-12-21 11 views
25

Preferiblemente usando IDEA IntelliJ. Intenté establecer un punto de interrupción dentro del procesador y ejecutarlo, pero no se rompió.¿cómo depurar los procesadores de anotación Java usando intellij?

+0

¿Cómo lo ejecutó? – jmg

+0

Estoy comenzando una clase principal que no hace nada. He habilitado el proceso de anotación como se describe [aquí] (http://blogs.jetbrains.com/idea/tag/annotation-processing/). – akula1001

+1

@ manu1001, esto no funcionará porque el procesador de anotación se ejecuta justo antes de que se ejecute el compilador. Luego, inicia JVM e intenta depurarlo. Puede depurar el código de la aplicación, pero no lo que está sucediendo en el procesador de anotación. – AlexR

Respuesta

28

Si realmente necesita depurar un procesador de anotaciones, podría ser mejor ejecutar el procesador de anotaciones desde la línea de comandos en lugar de dentro de su IDE con la depuración habilitada y adjuntarlo con el depurador del IDE.


Si se ejecuta javac directamente, puede depurar este especificando los siguientes parámetros adicionales:

javac -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 ... (usual javac parameters go here) 

Si se ejecuta Maven, utilice mvndebug en lugar del comando estándar mvn - Maven se ejecuta el compilador en proceso.


Si se ejecuta Ant, añada lo siguiente a la variable ANT_OPTS entorno antes de ejecutar:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 

Con todas estas ejecuciones, el javac, proceso Ant o Maven le esperará a adjuntar su depurador antes de que realmente comience a ejecutarse. Las instrucciones de IntelliJ para esto son here. Para Eclipse, here.

+1

Vea también cómo se hace para el procesador de Android Anotaciones [aquí] (http://www.pingtimeout.fr/2012/10/debugging-annotation-processor-in-every.html), el artículo explica cómo depurar un procesador de anotación en cada IDE. –

+0

¡Guau! Excelente respuesta! ¡Muchas gracias! – dmoebius

+0

-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = y, address = 8000 funciona para IntelliJ – LostSalad

7

Es posible ejecutar javac y depurarlo, como se indica más arriba. Sin embargo, en mi caso fue tedioso escribir el classpath completo, así que quería dejar esto en IDEA. Entonces, en el módulo donde quería aplicar mi procesador de anotación, simplemente crea una clase con el método principal.

public static void main(String[] args) { 
    com.sun.tools.javac.Main.main("-proc:only", 
     "-processor", "my.pkgs.MyAnnotationProcessor", 
     "my/pkgs/any/ClassIWantProcess.java"); 
} 

para que esto funcione es necesario agregar $JAVA_HOME/lib/tools.jar a JAR de su SDK (por defecto no está ahí). Esta es la misma razón por la que los servidores de aplicaciones que compilan JSP necesitan este JAR en su ruta de clase: necesitan el compilador.

Luego, simplemente configure el directorio de trabajo adecuado para su configuración de ejecución (para que la ruta relativa al archivo java sea correcta), configure su punto de interrupción en el procesador y depure a voluntad.

Beneficio - classpath ya está establecido por IDEA y utilizado por el javac "interno", porque aquí no es un proceso separado. Creo que es posible traducirlo a otros IDEs también.

+0

Acabo de pasar por este proceso y prefiero esta solución porque usa el indicador -processor que arroja errores más detallados que el --processorpath o -cp rutas de depuración de javac. Mi problema resultó ser que los archivos de clase que estaba produciendo no eran compatibles con el lugar donde los estaba ejecutando. – PaulR

+0

Aunque sé que estos comentarios no tienen mucho valor, pero esto es lo que terminé haciendo (agregué el 'JDK \ libs \ tools.jar' al proyecto como dependencia y ejecuté javac para el archivo' "c:/Desarrollo/HomeProjects/funky-apt/src/main/java/com/zhuinden/App.java "' (ruta absoluta)) y puedo depurar mi procesador de anotación. Gran respuesta. – EpicPandaForce

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 IntelliJ, 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.

12

sigue estos pasos, Estos trabajaron para mí en Android Studio para el proyecto Gradle: -

gradle.properties

1) .En añadir siguientes líneas

org.gradle.daemon=true 
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 

2) Construir .Edit configuración y añada remoto Configuración enter image description here

3). Ejecutar la configuración de ejecución recientemente creada APT.

4) .Add punto de rotura en el código de procesamiento de anotación y construir proyecto global

+1

Después de crear la configuración, aparece el error "No se puede encontrar o cargar la clase principal agentlib: jdwp [...]", y no tengo ni idea de por qué. – Dabbler

+2

Un paso omitido es ejecutar la tarea javac desde la aplicación cmd './gradlew.bat: compileDebugJavaWithJavac --debug' y luego iniciar inmediatamente la tarea de configuración creada desde IDE. – Pedram

0

Para un proyecto Maven, this post, lo que explica los siguientes pasos en un poco más de detalle, que funcionó para mí:

  1. Agregue la configuración de ejecución "Remoto" y configure "puerto" en 8000.

  2. Emita el comando mvnDebug clean install desde el directorio del proyecto (en la línea de comandos).

  3. Ejecute la configuración de ejecución. Para iniciar una nueva sesión después de que los procesos se cancelan, repita desde (2).

recordar ejecutar mvn install en las dependencias del proyecto cuando cambian (por ejemplo, si el procesador de anotación está en un artefacto diferente que el proyecto que se está depurando desde).

6

Este tutorial está escrito para un proyecto de Android. El nombre principal del módulo es "aplicación" como de costumbre. El proyecto contiene un submódulo llamado "anotación" que es subdependencia de "aplicación". El módulo "aplicación" ejecuta el proceso de anotación con la declaración gradle apt project(':annotation').

versión simple (proceso de compilación de la terminal y adjuntar a partir IDE)

  1. [requerido] Añadir una nueva configuración del proyecto "+" -> "a distancia". Marque "Solo instancia única". Todas las demás configuraciones se generan automáticamente. Deje <whole project> como classpath. El puerto debe dejarse como el predeterminado .

enter image description here

  1. [requerido] Asegúrese de detener todas las instancias Gradle llamando: ./gradlew --stop
  2. [requerido] ejecute el comando: ./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac

enter image description here

  1. Ejecute el proyecto APT conf iguration en modo de depuración tan rápido como sea posible :)

enter image description here


  1. [PISTA] Empezamos con un Empty gradle.properties archivo
  2. [AVISO] NO USE gradle daemon (--no-daemon/org.gradle.daemon = opción falsa)
  3. [SUGERENCIA] Ejecute gradle en debug modo (org.gradle.debug = true opcional)
  4. [PISTA] Ejecutar compilación del módulo de aplicación no la compilación del módulo (compilación de aplicación se ejecuta el procesamiento de anotación!) Del procesador
  5. Normalmente no se agrega una configuración del compilador Java en Android Studio (es decir, Archivo -> otros ajustes -> ajustes predeterminados)

VERSIÓN AMPLIADA (utilizar gradle.properties)

  1. Añadir lo siguiente a sus gradle.properties archivo:
 

    org.gradle.daemon=false 
    org.gradle.debug=true 

  1. Ejecutar la compilación de la terminal:

./gradlew :app:clean :app:compileDebugJavaWithJavac

enter image description here


avanzada versión (basta con pulsar de depuración en el IDE)

  1. Agregue un script bash a su profesional ject principal dir (ej. compile.sh)
 
#!/bin/bash 
./gradlew :app:clean :app:compileDebugJavaWithJavac & 

recordar acerca de los '&' señal para procesamiento en segundo plano.

  1. Vaya a la configuración de APT que creamos en el paso 1 y agregue un Antes de iniciar la configuración. Seleccione Ejecute la herramienta externa.

enter image description here

  1. Añadir la ruta al script decompile.sh hemos creado antes.

enter image description here


Advertencia

Messing compilación Gradle, excepciones NullPointer durante la compilación etc. dan lugar a veces estar atrapado Android Studio (congelado en el escenario de actualización Gradle). Si no puede parada Gradle desde el IDE a continuación, utilizar este comando en el terminal:

ps -A | grep gradle | awk '{ print $1; }' | xargs kill -9 

activada la opción de depuración durante el proyecto refrescar a veces ayuda Android Studio para volver al camino correcto.

Cuestiones relacionadas