我正在编写一个简单的注释处理器并尝试使用eclipse进行调试。我为注释处理器创建了一个新项目,并根据需要在META-INF下配置了javax.annotation.processing.Processor,它可以很好地处理注释。
然后,我添加了一些代码并尝试调试,但永远不会在注释处理器中添加的断点处停止执行。我正在使用ant编译,我正在使用以下ANT选项。
export ANT_OPTS =“ - Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = y,address = 8000”
触发ant build后,我创建一个远程调试配置,调试器启动正常。 Ant构建也成功启动。但是在注释处理器中添加的任何断点处执行都不会停止。
答案 0 :(得分:22)
这是我遇到的一个问题,eclipse插件解决方案对我来说似乎非常麻烦。我找到了一个更简单的解决方案,使用javax.tools.JavaCompiler来调用编译过程。使用下面的代码,您只需右键单击> Debug As>在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);
}
答案 1 :(得分:2)
最简单的方法是创建一个eclipse插件,然后直接从eclipse调试它。 这听起来要难得多了 - 这个:https://www.youtube.com/watch?v=PjUaHkUsgzo是youtube中的7分钟指南,可以帮助你入门。
答案 2 :(得分:2)
这个问题已经发布了6年多了,但是,我现在遇到了同样的问题,但是在Internet上仍然找不到很好的答案。
我终于能够设计出一个很好的设置,使我能够开发一个注释处理器,将其用于另一个项目的编译中,并根据需要对其进行调试。
设置如下:
在带有GAV的项目中开发的注释处理器:
<groupId>infra</groupId>
<artifactId>annotation-processor</artifactId>
<version>1.0-SNAPSHOT</version>
在注释处理器POM文件中,我指定了以下内容:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<compilerArgument>-proc:none</compilerArgument>
<source>${java.source.version}</source>
<target>${java.source.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
注意<compilerArgument>-proc:none</compilerArgument>
规范。
在使用注释处理器的项目中,在项目编译期间使用它。即注释处理器在编译器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
请注意suspend=y
命令行中的javac
部分。这告诉JVM暂停执行,直到调试器附加到它为止。
在这种情况下,我可以通过启动远程Java应用程序调试配置来启动Eclipse调试器。配置它以使用注释处理器项目,并附加到本地主机和端口1044上的进程。这使您可以调试注释处理器代码。如果您在init
或process
方法中设置断点,调试器将中断。
为了在使用Maven进行编译时启用相同的调试体验,我按如下所示设置POM文件:
<dependency>
<groupId>infra</groupId>
<artifactId>annotation-processor</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<fork>true</fork>
<compilerArgs>
<compilerArg>-J-verbose</compilerArg>
<compilerArg>${enableDebugAnnotationCompilerArg}</compilerArg>
</compilerArgs>
<forceJavacCompilerUse>true</forceJavacCompilerUse>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>infra</groupId>
<artifactId>annotation-processor</artifactId>
<version>1.0-SNAPSHOT</version>
</annotationProcessorPath>
</annotationProcessorPaths>
<annotationProcessors>
<annotationProcessor>infra.annotation.CustomizationAnnotationProcessor</annotationProcessor>
</annotationProcessors>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>debugAnnotation</id>
<properties>
<enableDebugAnnotationCompilerArg>-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044</enableDebugAnnotationCompilerArg>
</properties>
</profile>
</profiles>
注意使用<fork>true</fork>
,
和<compilerArg>${enableDebugAnnotationCompilerArg}</compilerArg>
。
另外,请注意debugAnnotation
的配置文件定义和
<enableDebugAnnotationCompilerArg>
属性。
这使我们可以启动注释处理器的调试会话
通过运行mvn -P debugAnnotation package
并将Eclipse调试器附加到编译器