Java 如何在编译期间调试注释处理器?

Java 如何在编译期间调试注释处理器?,java,debugging,maven,ant,annotation-processing,Java,Debugging,Maven,Ant,Annotation Processing,我有一个用于retention policy=SOURCE注释的注释处理器 我不知道如何分步调试它 当我运行mvn安装、编译或打包或ant javac时,我已经发布了打印语句、记录器信息,并且我在编译日志中看到了它们的系统输出 但是,我不知道如何在Eclipse中分步调试处理器。我的意思是,如何在编译时分步调试 您必须使用调试配置从Eclipse调用Java编译器(您需要从“调试配置…”菜单选项手动创建配置) 在JDK1.6或更高版本下调用Java编译器的“正确”方法是使用中的接口,您可以从中

我有一个用于retention policy=SOURCE注释的注释处理器

我不知道如何分步调试它

  • 当我运行mvn安装、编译或打包或ant javac时,我已经发布了打印语句、记录器信息,并且我在编译日志中看到了它们的系统输出

  • 但是,我不知道如何在Eclipse中分步调试处理器。我的意思是,如何在编译时分步调试


您必须使用调试配置从Eclipse调用Java编译器(您需要从“调试配置…”菜单选项手动创建配置)

在JDK1.6或更高版本下调用Java编译器的“正确”方法是使用中的接口,您可以从中获得该接口(我包括所有链接,因为您应该阅读大量的类/包文档)


“快速而肮脏”的方法(应该可以,但我不能保证)是调用
com.sun.tools.javac.Main.Main()
,将您的常规命令行参数传递给它。为此,您需要在类路径上使用
tools.jar
(可以在
$JAVA\u HOME/lib
中找到).

最近的一个选项是使用类似的工具,可以对任意注释处理器调用编译作业,您可以设置断点、单步执行等

@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);
}
此测试预期您将收到一些错误消息,因为@MyAnnotation在测试数据源中的声明不正确。如果此断言失败,您可以在IDE的调试模式下运行它,在MyProcessor中设置断点,并在调试过程中使完整的编译器环境处于活动状态


对于处理器中特定于单元测试的方法,您还可以使用名为CompilationRule的@Rule,从中可以获取元素和类型实用程序类,以便以更隔离的方式测试编译器中的特定逻辑。

注释处理在编译期间发生,因此正常调试无法工作。如果您希望在项目的上下文中,您可以使用Eclipse远程调试,同时让Gradle或Maven处于调试模式。然后您可以在注释处理器的文件中放置断点


免责声明:我写了这篇文章。

hi,读了这个被接受的答案,让我觉得这是一个问题的解决方案。顺便说一下,我不明白什么是“使用调试配置从Eclipse调用Java编译器”(您需要从“调试配置”手动创建配置)。“意思是。你能更好地解释一下吗?thanksI在现有项目中添加了tools.jar和processor jar。然后按照建议使用com.sun.tools.javac.Main类。创建了一个Java应用程序调试配置,其中tools.jar位于类路径中,javac参数作为程序参数。效果非常好-谢谢!