10

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

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

  • 我在运行 mvn install、compile or package 或 ant javac 时发出了打印语句、记录器信息,并且我在编译日志中看到了它们的 sysout。

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

4

3 回答 3

7

最近的一个选项是使用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,您可以从中获取 Elements 和 Types 实用程序类,以便以更独立的方式测试编译器中的特定逻辑。

于 2014-11-06T21:49:57.787 回答
5

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

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

“快速而肮脏”的方式(应该有效,但我不保证)是调用com.sun.tools.javac.Main.main(),将您的正常命令行参数传递给它。为此,您需要tools.jar在您的类路径中(在 中找到它$JAVA_HOME/lib)。

于 2012-10-04T20:49:26.587 回答
2

注解处理在编译过程中进行,因此无法正常调试。如果你想在你的项目上下文中调试它,你可以使用 Eclipse 远程调试,同时让 Gradle 或 Maven 处于调试模式。然后您可以在注释处理器的文件中放置断点。

请参阅在任何项目中调试注释处理器

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

于 2016-03-29T14:05:38.507 回答