Search code examples
javaeclipseantremote-debuggingannotation-processing

Debugging Annotation processors in eclipse


I am writing a simple annotation processor and trying to debug it using eclipse. I created a new project for annotation processor and configured javax.annotation.processing.Processor under META-INF as needed and it processes annotations fine.

Then, I added some more code and tried debugging, but could never make the execution stop at the breakpoints added in the annotation processor. I am compiling using ant and I am using the following ANT options.

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

After triggering ant build, i go create a remote debug configuration and the debugger starts fine. Ant build also starts successfully. But the execution never stops at any break point added in the annotation processor.


Solution

  • This is a problem I just ran into, and the eclipse plugin solution seems super cumbersome to me. I found a simpler solution using javax.tools.JavaCompiler to invoke the compilation process. Using the code below, you can just Right-Click > Debug As > JUnit Test in eclipse and debug you annotation processor directly from there

       @Test
       public void runAnnoationProcessor() throws Exception {
          String source = "my.project/src";
    
          Iterable<JavaFileObject> files = getSourceFiles(source);
    
          JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    
          CompilationTask task = compiler.getTask(new PrintWriter(System.out), null, null, null, null, files);
          task.setProcessors(Arrays.asList(new MyAnnotationProcessorClass()));
    
          task.call();
       }
    
       private Iterable<JavaFileObject> getSourceFiles(String p_path) throws Exception {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
         StandardJavaFileManager files = compiler.getStandardFileManager(null, null, null);
    
         files.setLocation(StandardLocation.SOURCE_PATH, Arrays.asList(new File(p_path)));
    
         Set<Kind> fileKinds = Collections.singleton(Kind.SOURCE);
         return files.list(StandardLocation.SOURCE_PATH, "", fileKinds, true);
       }