你如何使用intellij调试java注释处理器?

IT小君   2021-12-11T06:46:35

如何使用 Intellij 调试 Java 注释处理器?

最好使用 IDEA IntelliJ。我尝试在处理器内部设置断点并运行,但没有中断。

评论(8)
IT小君

如果您确实需要调试注释处理器,最好从命令行运行注释处理器,而不是在启用调试的 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,这里.

2021-12-11T06:46:35   回复
IT小君

本教程是为一个Android 项目编写的像往常一样,主模块名称是“app”该项目包含一个名为“annotation”的子模块,它是“app”的子依赖项。“app”模块使用 gradle 声明运行注释处理 apt project(':annotation')

简单版本 (从终端运行编译并从 IDE 连接)

  1. [必需] 添加一个新的项目配置"+" -> "Remote"选中“仅单个实例”所有其他设置都是自动生成的。保留<whole project>为类路径。端口应保留为默认值5005

在此处输入图片说明

  1. [必需] 确保通过调用以下方法停止所有 gradle 实例: ./gradlew --stop
  2. [必需] 运行命令: ./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac

在此处输入图片说明

  1. 尽可能快地在调试模式下运行 APT 项目配置:)

在此处输入图片说明


  1. [提示] 我们从一个空的gradle.properties文件开始
  2. [提示] 不要使用 gradle守护进程( --no-daemon / org.gradle.daemon=false 选项)
  3. [提示] 在调试模式下运行 gradle ( org.gradle.debug=true 选项)
  4. [提示] 运行应用程序的模块编译而不是处理器的模块编译(应用程序的编译运行注释处理!)
  5. 我们通常不会在 Android Studio 中添加任何 Java 编译器设置(即文件 -> 其他设置 -> 默认设置)

扩展版本(使用gradle.properties

  1. 将以下内容添加到gradle.properties文件中:

    org.gradle.daemon=false
    org.gradle.debug=true

  1. 从终端运行编译:

./gradlew :app:clean :app:compileDebugJavaWithJavac

在此处输入图片说明


高级版本(只需在 IDE 中按 debug)

  1. 将 bash 脚本添加到您的项目主目录(例如compile.sh
#!/bin/bash
./gradlew :app:clean :app:compileDebugJavaWithJavac &

请记住用于后台处理的“&”符号。

  1. 转到我们在步骤 1 中创建的 APT 配置设置并添加一个Before launch configuration选择运行外部工具

在此处输入图片说明

  1. 将路径添加到我们之前创建compile.sh脚本。

在此处输入图片说明


警告

乱七八糟的 gradle 编译、编译期间的NullPointer 异常等有时会导致 AndroidStudio 卡住(在 gradle 刷新阶段冻结)。如果您无法从 IDE停止 gradle,请在终端中使用此命令:

ps -A | grep gradle | awk '{ print $1; }' | xargs kill -9

在项目刷新期间关闭调试选项有时有助于 Android Studio 回到正确的轨道。

2021-12-11T06:46:35   回复
IT小君

请按照以下步骤操作,这些在 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

2).编辑构建配置并添加远程配置 在此处输入图片说明

3).运行最近创建的运行配置APT。

4).注解处理代码中添加断点,构建整体工程

2021-12-11T06:46:36   回复
IT小君

可以运行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。

2021-12-11T06:46:36   回复
IT小君

对于 Maven 项目,这篇文章更详细地解释了以下步骤,对我有用:

  1. 添加“远程”运行配置并将“端口”设置为 8000。

  2. mvnDebug clean install从项目目录(在命令行上)发出命令

  3. 运行运行配置。为了在进程退出后启动新会话,请从 (2) 开始重复。

请记住mvn install在项目的依赖项更改时运行它们(例如,如果注释处理器与您正在调试它的项目位于不同的工件中)。

2021-12-11T06:46:36   回复
IT小君

我发现以下资源可以帮助您:http : //code.google.com/p/acris/wiki/AnnotationProcessing_DebuggingEclipse

这家伙一步一步地解释了如何使用 Eclipse 调试注释处理器。

2021-12-11T06:46:37   回复
IT小君

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

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

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

2021-12-11T06:46:37   回复
IT小君

使用 IntelliJ IDEA 和 Gradle 调试注释处理器

  1. 设置自定义 VM 选项-Dcompiler.process.debug.port=5005:按Ctrl + Shift + A在操作列表中选择编辑自定义 VM 选项...以添加自定义 VM 选项,然后重新启动 IDE。
  2. 使用默认参数创建远程调试配置:Run -> Edit Configurations... -> Add New Configuration (Alt + Insert) -> Remote在此处输入图片说明
  3. 设置断点。
  4. 从终端使用 Gradle 构建:($ ./gradlew --no-daemon -Dorg.gradle.debug=true clean build如果命令的执行被冻结也没关系,不要终止进程)。
  5. 在 IDE 中调试远程调试配置(参见步骤 3):选择合适的远程调试配置并按Shift + F9在此处输入图片说明

希望它可以帮助某人:)

2021-12-11T06:46:37   回复