Java 在eclipse中调试注释处理器
我正在编写一个简单的注释处理器,并尝试使用eclipse对其进行调试。我为annotation processor创建了一个新项目,并根据需要在META-INF下配置javax.annotation.processing.processor,它可以很好地处理注释 然后,我又添加了一些代码并尝试调试,但无法在注释处理器中添加的断点处停止执行。我使用ant进行编译,并使用以下ant选项 export ANT_OPTS=“-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000”Java 在eclipse中调试注释处理器,java,eclipse,ant,remote-debugging,annotation-processing,Java,Eclipse,Ant,Remote Debugging,Annotation Processing,我正在编写一个简单的注释处理器,并尝试使用eclipse对其进行调试。我为annotation processor创建了一个新项目,并根据需要在META-INF下配置javax.annotation.processing.processor,它可以很好地处理注释 然后,我又添加了一些代码并尝试调试,但无法在注释处理器中添加的断点处停止执行。我使用ant进行编译,并使用以下ant选项 export ANT_OPTS=“-Xdebug-Xrunjdwp:transport=dt_socket,ser
触发ant build之后,我创建了一个远程调试配置,调试器可以正常启动。Ant构建也成功启动。但是在注释处理器中添加的任何断点处执行都不会停止。最简单的方法是创建一个eclipse插件,然后直接从eclipse调试它。
这听起来比实际情况要困难得多——这是youtube上的一个7分钟指南,可以帮助您入门。这是我刚刚遇到的一个问题,eclipse插件解决方案对我来说似乎超级麻烦。我发现了一个更简单的解决方案,使用javax.tools.JavaCompiler调用编译过程。使用下面的代码,您只需在eclipse中右键单击>调试为>JUnit测试,然后直接从那里调试注释处理器
@Test
public void runAnnoationProcessor() throws Exception {
String source = "my.project/src";
Iterable<JavaFileObject> files = getSourceFiles(source);
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CompilationTask task = compiler.getTask(new PrintWriter(System.out), null, null, null, null, files);
task.setProcessors(Arrays.asList(new MyAnnotationProcessorClass()));
task.call();
}
private Iterable<JavaFileObject> getSourceFiles(String p_path) throws Exception {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager files = compiler.getStandardFileManager(null, null, null);
files.setLocation(StandardLocation.SOURCE_PATH, Arrays.asList(new File(p_path)));
Set<Kind> fileKinds = Collections.singleton(Kind.SOURCE);
return files.list(StandardLocation.SOURCE_PATH, "", fileKinds, true);
}
@测试
public void runAnnoationProcessor()引发异常{
字符串source=“my.project/src”;
Iterable files=getSourceFiles(源文件);
JavaCompiler=ToolProvider.getSystemJavaCompiler();
CompilationTask=compiler.getTask(新的PrintWriter(System.out),null,null,null,null,files);
task.setProcessors(Arrays.asList(新的MyAnnotationProcessorClass());
task.call();
}
私有Iterable getSourceFiles(字符串p_路径)引发异常{
JavaCompiler=ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager files=compiler.getStandardFileManager(null,null,null);
files.setLocation(StandardLocation.SOURCE_PATH,Arrays.asList(新文件(p_PATH));
设置fileKinds=Collections.singleton(Kind.SOURCE);
返回files.list(StandardLocation.SOURCE_PATH,“”,filetypes,true);
}
这个问题已经发布了6年多了,但是,我现在遇到了同样的问题,仍然无法在互联网上找到好的答案
我终于能够设计出一个好的设置,它允许我开发一个注释处理器,在编译另一个项目时使用它,并根据需要进行调试
设置如下所示:
infra
注释处理器
1.0-快照
org.apache.maven.plugins
maven编译器插件
${maven.compiler.plugin.version}
-过程:无
${java.source.version}
${java.source.version}
UTF-8
请注意-proc:none
规范javac
。我发现,为了在直接运行javac
时调试注释处理器的执行,我可以使用以下命令行:
javac-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044-d target/classes-proc:only-processor infra.annotation.CustomizationAnnotationProcessor-cp../annotation processor/target/annotation-processor-1.0-SNAPSHOT.jar src\main\java\org\digital\annotationtest\MyTestClass.java
注意javac
命令行中的suspend=y
部分。这会告诉JVM暂停执行,直到调试器连接到它init
或process
方法中设置断点,调试器将中断
红外线
注释处理器
1.0-快照
org.apache.maven.plugins
maven编译器插件
${maven.compiler.plugin.version}
1.8
1.8
真的
-J-详细
${enableDebugAnnotationCompilerArg}
真的
红外线
注释处理器
1.0-快照
infra.annotation.CustomizationAnnotationProcessor
调试注释
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
注意使用true
,
和${enableDebugAnnotationCompilerArg}
另外,请注意
debugAnnotation
的概要文件定义和
属性。
这允许我们启动一个调试程序