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?
Respuesta
me encontré con el siguiente recurso que puede ayudarle a: http://code.google.com/p/acris/wiki/AnnotationProcessing_DebuggingEclipse
El chico explica paso a paso cómo depurar procesadores de anotación utilizando Eclipse.
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.
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. –
¡Guau! Excelente respuesta! ¡Muchas gracias! – dmoebius
-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = y, address = 8000 funciona para IntelliJ – LostSalad
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.
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
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
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.
sigue estos pasos, Estos trabajaron para mí en Android Studio para el proyecto Gradle: -
gradle.properties1) .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
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
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
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
Para un proyecto Maven, this post, lo que explica los siguientes pasos en un poco más de detalle, que funcionó para mí:
Agregue la configuración de ejecución "Remoto" y configure "puerto" en 8000.
Emita el comando
mvnDebug clean install
desde el directorio del proyecto (en la línea de comandos).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).
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)
- [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 .
- [requerido] Asegúrese de detener todas las instancias Gradle llamando:
./gradlew --stop
- [requerido] ejecute el comando:
./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac
- Ejecute el proyecto APT conf iguration en modo de depuración tan rápido como sea posible :)
- [PISTA] Empezamos con un Empty gradle.properties archivo
- [AVISO] NO USE gradle daemon (--no-daemon/org.gradle.daemon = opción falsa)
- [SUGERENCIA] Ejecute gradle en debug modo (org.gradle.debug = true opcional)
- [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
- 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)
- Añadir lo siguiente a sus gradle.properties archivo:
org.gradle.daemon=false org.gradle.debug=true
- Ejecutar la compilación de la terminal:
./gradlew :app:clean :app:compileDebugJavaWithJavac
avanzada versión (basta con pulsar de depuración en el IDE)
- 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.
- 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.
- Añadir la ruta al script decompile.sh hemos creado antes.
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.
- 1. Invocar mediante programación los procesadores de anotación
- 2. ¿Cómo depurar correctamente Java (Android) usando Eclipse?
- 3. cómo arrancan los procesadores multinúcleo?
- 4. En IntelliJ, ¿cómo puedo depurar un objetivo de prueba Maven?
- 5. ¿Cómo depurar usando gdb?
- 6. Cómo cambiar los procesadores en matplotlib/Python
- 7. Cómo depurar un punto muerto en Java usando Eclipse
- 8. Cómo depurar Java -JNI usando GDB en Linux?
- 9. Cómo depurar la aplicación Java EE usando WebLogic 10.3
- 10. Procesadores de recuento usando C++ en Windows
- 11. @UniqueConstraint anotación en Java
- 12. ¿Cómo "Maveniza" un proyecto usando Intellij?
- 13. Cómo escribir un procesador de anotación Java?
- 14. Descifrar información variable al depurar Java
- 15. ¿Cómo depurar programas usando señales?
- 16. Cómo depurar el servlet usando Eclipse
- 17. Java - JPA - @Version Anotación
- 18. eclipse java proceso de anotación
- 19. Anotación Java equivalente C#
- 20. Cómo depurar Java Swing Layouts
- 21. Java anotación tipografía dinámica
- 22. ¿Cómo depurar los servicios RESTful?
- 23. procesador de anotación Java 6 Adelante compatible y SupportedSourceVersion
- 24. cómo ingresar al código desde jar (no JDK) usando IntelliJ?
- 25. ¿Pueden los procesadores XSLT tener múltiples subprocesos?
- 26. ¿Quitar los comentarios del archivo fuente usando IntelliJ?
- 27. Cómo crear una anotación personalizada en java?
- 28. Google App Engine Desarrollo Java en IntelliJ?
- 29. ¿Orden sugerida de anotación Java?
- 30. Java anotación devuelve los nombres de clase crípticos
¿Cómo lo ejecutó? – jmg
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
@ 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