Come eseguire il debug del processore di annotazione durante la compilazione?

Ho un processore di annotazione per un’annotazione del criterio di conservazione = SOURCE.

Non ho idea di come eseguirne il debug passo passo.

  • Ho rilasciato dichiarazioni di stampa, informazioni sul logger quando eseguo mvn install, compile o package o ant javac, e vedo i loro sysout nel log di compilazione.

  • Tuttavia, non ho idea di come eseguire il debug del processore in Eclipse. Voglio dire, come fai a eseguire il debugging in fase di compilazione?

Devi richiamare il compilatore Java da Eclipse, usando una configurazione di debug (dovrai creare manualmente la configurazione, dalla voce di menu “Debug Configurations …”.

Il modo “corretto” per richiamare il compilatore Java sotto JDK 1.6 o superiore è usare l’interfaccia JavaCompiler in javax.tools , che si ottiene da ToolProvider (includo tutti i collegamenti perché c’è una discreta quantità di documentazione di class / pacchetto che dovresti leggere).

Il modo “quick-and-dirty” (che dovrebbe funzionare, ma non ho garanzie) è quello di invocare com.sun.tools.javac.Main.main() , passando i normali argomenti della riga di comando. Per fare ciò, avrete bisogno di tools.jar sul classpath (si trova in $JAVA_HOME/lib ).

Un’opzione negli ultimi tempi è quella di utilizzare qualcosa come http://github.com/google/compile-testing che consente di richiamare il processo di compilazione su processori di annotazione arbitrari, che è ansible impostare punti di interruzione, passaggio, ecc.

 @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); } 

Questo test prevede che verrà visualizzato un messaggio di errore perché @MyAnnotation viene dichiarato in modo errato nell’origine dati di test. Se questa asserzione fallisce, è ansible eseguirla in modalità debug nell’IDE, impostare i breakpoint in MyProcessor e passare attraverso un ambiente di compilazione completo attivo durante il debug.

Per il test unitario di metodi specifici all’interno del processore, è anche ansible utilizzare @Rule chiamato CompilationRule da cui è ansible ottenere classi di utilità Elements e Types per testare la logica specifica nel compilatore in un modo più isolato.

L’elaborazione delle annotazioni avviene durante la compilazione, quindi il normale debug non funzionerà. Se si desidera eseguire il debug nel contesto del progetto, è ansible utilizzare il debug remoto di Eclipse, mentre si dispone di Gradle o Maven in modalità di debug. Quindi è ansible inserire i punti di interruzione nei file del Processore di annotazione.

Vedi Debug di un processore di annotazione in qualsiasi progetto .

Disclaimer: ho scritto il post.