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

Ble*_*eek 9 java ant debugging maven annotation-processing

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

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

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

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

Chr*_*ber 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);
}
Run Code Online (Sandbox Code Playgroud)

此测试期望您将收到一些错误消息,因为在测试数据源中错误地声明了@MyAnnotation.如果此断言失败,您可以在IDE中以调试模式运行它,在MyProcessor中设置断点,并在调试期间使用完整的编译器环境逐步执行.

单元测试特定的方法的处理器,也可以使用称为CompilationRule从中可以得到以测试特定的逻辑在你的编译器在多种分离的方式元素和类型的工具类的@rule.


小智 5

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

在JDK 1.6或更高版本下调用Java编译器的"正确"方法是使用javax.tools中JavaCompiler接口,它是从ToolProvider获得的(我包含所有链接,因为你有相当数量的类/包文档)应该读).

"快速和肮脏"的方式(应该工作,但我不保证)是调用com.sun.tools.javac.Main.main(),传递它正常的命令行参数.要做到这一点,你需要tools.jar在你的类路径(它找到$JAVA_HOME/lib).