调试 Eclipse 中的注释处理器

我正在编写一个简单的注释处理器,并尝试使用eclipse对其进行调试。我为注释处理器创建了一个新项目,并根据需要在META-INF下配置javax.annotation.processing.Processor,它可以很好地处理注释。

然后,我添加了更多的代码并尝试调试,但永远无法使执行在注释处理器中添加的断点处停止。我正在使用蚂蚁编译,我使用以下蚂蚁选项。

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

触发蚂蚁构建后,我去创建一个远程调试配置,调试器启动良好。蚂蚁构建也成功启动。但是,执行永远不会在注释处理器中添加的任何断点处停止。


答案 1

这是我刚刚遇到的一个问题,eclipse插件解决方案对我来说似乎非常麻烦。我发现了一个更简单的解决方案,使用javax.tools.JavaCompiler来调用编译过程。使用下面的代码,您只需右键单击>在eclipse中调试为>JUnit Test,然后直接从那里调试注释处理器

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

答案 2

这个问题已经发布了6年多前,但是,我现在遇到了同样的问题,仍然无法在互联网上找到一个好的答案。

我终于能够制定出一个很好的设置,允许我开发一个注释处理器,在编译另一个项目时使用它,并根据需要进行调试。

设置如下所示:

  1. 在GAV的项目中开发的注释处理器:

    <groupId>infra</groupId> <artifactId>annotation-processor</artifactId> <version>1.0-SNAPSHOT</version>

  2. 在注释处理器POM文件中,我指定了以下内容:

    <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> <configuration> <compilerArgument>-proc:none</compilerArgument> <source>${java.source.version}</source> <target>${java.source.version}</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>

    请注意规范。<compilerArgument>-proc:none</compilerArgument>

  3. 在使用注释处理器的项目中,它将在项目编译期间使用。即,注释处理器在编译器执行期间调用。我发现,为了在直接运行时调试注释处理器执行,我可以使用以下命令行:javacjavac

    javac -J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044 -d target/classes -proc:only -processor infra.annotation.CustomAnnotationProcessor -cp ../annotation-processor/target/annotation-processor-1.0-SNAPSHOT.jar src\main\java\org\digital\annotationtest\MyTestClass.java

    请注意 命令行中的部分。这告诉 JVM 暂停执行,直到调试器附加到它。suspend=yjavac

  4. 在此情况下,我可以通过启动远程 Java 应用程序调试配置来启动 eclipse 调试器。将其配置为使用注释处理器项目,并附加到本地主机和端口 1044 上的进程。这允许您调试注释处理器代码。如果在 or 方法中设置断点,调试器将中断。initprocess

  5. 为了在使用 Maven 进行编译时启用相同的调试体验,我按如下方式设置了 POM 文件:

    1. 向使用注释处理器的 POM 添加依赖项: <dependency> <groupId>infra</groupId> <artifactId>annotation-processor</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
    2. 在使用注释处理器的同一项目中,定义以下内容:

    <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> <configuration> <source>1.8</source> <target>1.8</target> <fork>true</fork> <compilerArgs> <compilerArg>-J-verbose</compilerArg> <compilerArg>${enableDebugAnnotationCompilerArg}</compilerArg> </compilerArgs> <forceJavacCompilerUse>true</forceJavacCompilerUse> <annotationProcessorPaths> <annotationProcessorPath> <groupId>infra</groupId> <artifactId>annotation-processor</artifactId> <version>1.0-SNAPSHOT</version> </annotationProcessorPath> </annotationProcessorPaths> <annotationProcessors> <annotationProcessor>infra.annotation.CustomizationAnnotationProcessor</annotationProcessor> </annotationProcessors> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>debugAnnotation</id> <properties> <enableDebugAnnotationCompilerArg>-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044</enableDebugAnnotationCompilerArg> </properties> </profile> </profiles>

    请注意 、 和 的用法。
    另外,请注意属性的配置文件取消和定义。这允许我们通过运行 eclipse 调试器并将其附加到编译器进程来启动注释处理器的调试会话,其方式与上面 4 中描述的相同。<fork>true</fork><compilerArg>${enableDebugAnnotationCompilerArg}</compilerArg>debugAnnotation<enableDebugAnnotationCompilerArg>mvn -P debugAnnotation package


推荐