如何使用 Intellij 调试 Java 注释处理器?
最好使用 IDEA IntelliJ。我尝试在处理器内部设置断点并运行,但没有中断。
如何使用 Intellij 调试 Java 注释处理器?
最好使用 IDEA IntelliJ。我尝试在处理器内部设置断点并运行,但没有中断。
本教程是为一个Android 项目编写的。像往常一样,主模块名称是“app”。该项目包含一个名为“annotation”的子模块,它是“app”的子依赖项。“app”模块使用 gradle 声明运行注释处理
apt project(':annotation')
。
简单版本 (从终端运行编译并从 IDE 连接)
<whole project>
为类路径。端口应保留为默认值5005。./gradlew --stop
./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac
扩展版本(使用gradle.properties)
org.gradle.daemon=false org.gradle.debug=true
./gradlew :app:clean :app:compileDebugJavaWithJavac
高级版本(只需在 IDE 中按 debug)
#!/bin/bash ./gradlew :app:clean :app:compileDebugJavaWithJavac &
请记住用于后台处理的“&”符号。
警告
乱七八糟的 gradle 编译、编译期间的NullPointer 异常等有时会导致 AndroidStudio 卡住(在 gradle 刷新阶段冻结)。如果您无法从 IDE停止 gradle,请在终端中使用此命令:
ps -A | grep gradle | awk '{ print $1; }' | xargs kill -9
在项目刷新期间关闭调试选项有时有助于 Android Studio 回到正确的轨道。
请按照以下步骤操作,这些在 android studio for gradle 项目中对我有用:-
1).在 gradle.properties 中添加以下几行
org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
3).运行最近创建的运行配置APT。
4).注解处理代码中添加断点,构建整体工程
可以运行javac
和调试它,如上所示。然而,在我的情况下,编写完整的类路径很乏味,所以我想把它留给 IDEA。所以在我想应用我的注释处理器的模块中,只需创建一个带有 main 方法的类。
public static void main(String[] args) {
com.sun.tools.javac.Main.main("-proc:only",
"-processor", "my.pkgs.MyAnnotationProcessor",
"my/pkgs/any/ClassIWantProcess.java");
}
为此,您需要将其添加$JAVA_HOME/lib/tools.jar
到 SDK 的 JAR 中(默认情况下它不存在)。这与编译 JSP 的应用服务器在其类路径上需要此 JAR 的原因相同——他们需要编译器。
然后只需为您的运行配置设置适当的工作目录(因此 java 文件的相对路径是正确的),将断点设置到处理器中并随意调试!
好处 - 类路径已由 IDEA 设置并由“内部”javac 使用,因为在这里它不是一个单独的进程。我相信也可以将其转换为其他 IDE。
对于 Maven 项目,这篇文章更详细地解释了以下步骤,对我有用:
添加“远程”运行配置并将“端口”设置为 8000。
mvnDebug clean install
从项目目录(在命令行上)发出命令。
运行运行配置。为了在进程退出后启动新会话,请从 (2) 开始重复。
请记住mvn install
在项目的依赖项更改时运行它们(例如,如果注释处理器与您正在调试它的项目位于不同的工件中)。
我发现以下资源可以帮助您:http : //code.google.com/p/acris/wiki/AnnotationProcessing_DebuggingEclipse
这家伙一步一步地解释了如何使用 Eclipse 调试注释处理器。
注解处理发生在编译过程中,因此无法正常调试。如果你想在你的项目上下文中调试它,你可以使用 IntelliJ 远程调试,同时让 Gradle 或 Maven 处于调试模式。然后您可以在注释处理器的文件中放置断点。
请参阅在任何项目中调试注释处理器。
免责声明:我写了这篇文章。
-Dcompiler.process.debug.port=5005
:按Ctrl + Shift + A并在操作列表中选择编辑自定义 VM 选项...以添加自定义 VM 选项,然后重新启动 IDE。$ ./gradlew --no-daemon -Dorg.gradle.debug=true clean build
如果命令的执行被冻结也没关系,不要终止进程)。希望它可以帮助某人:)
如果您确实需要调试注释处理器,最好从命令行运行注释处理器,而不是在启用调试的 IDE 中运行并使用 IDE 的调试器附加到该处理器。
如果
javac
直接运行,您可以通过指定以下额外参数来调试:javac -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 ... (usual javac parameters go here)
如果运行 Maven,请使用
mvndebug
而不是标准mvn
命令 - Maven 在进程内运行编译器。如果运行 Ant,请
ANT_OPTS
在运行前将以下内容添加到环境变量中:-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
对于所有这些执行,javac、Ant 或 Maven 进程将在实际开始执行之前等待您附加调试器。IntelliJ 说明在这里。对于 Eclipse,这里.