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

时间:2012-10-04 19:19:20

标签: java debugging maven ant annotation-processing

我有一个注释处理器,用于注释保留策略= SOURCE。

我不知道如何逐步调试它。

  • 我运行mvn install,编译或打包或者ant javac时发出了print语句,logger信息,我在编译日志中看到了他们的sysouts。

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

3 个答案:

答案 0 :(得分:6)

最近的一个选项是使用类似http://github.com/google/compile-testing的东西,它允许您针对任意注释处理器调用编译作业,您可以设置断点,逐步执行等。

@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,您可以从中获取元素和类型实用程序类,以便在编译器中测试特定逻辑孤立的方式。

答案 1 :(得分:5)

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

在JDK 1.6或更高版本下调用Java编译器的“正确”方法是使用JavaCompiler中的javax.tools接口,该接口来自ToolProvider(我包括所有链接,因为你应该阅读相当数量的类/包文档。

“快速而肮脏”的方式(应该工作,但我不保证)是调用com.sun.tools.javac.Main.main(),传递它正常的命令行参数。要执行此操作,您需要在类路径上tools.jar(它位于$JAVA_HOME/lib中)。

答案 2 :(得分:2)

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

请参阅Debugging an Annotation Processor in any project

免责声明:我写了帖子。