我有一个注释处理器,用于注释保留策略= SOURCE。
我不知道如何逐步调试它。
我运行mvn install,编译或打包或者ant javac时发出了print语句,logger信息,我在编译日志中看到了他们的sysouts。
但是,我不知道如何在Eclipse中逐步调试处理器。我的意思是,你如何逐步调试编译时间?
答案 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。
免责声明:我写了帖子。