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

如何使用intellij调试java注释处理器?,java,intellij-idea,Java,Intellij Idea,如何使用intellij调试java注释处理器 最好使用IDEA IntelliJ。我尝试在处理器内设置断点并运行,但它没有中断。我发现以下资源可以帮助您: 这家伙一步一步地解释了如何使用Eclipse调试注释处理器。如果您确实需要调试注释处理器,那么最好从命令行运行注释处理器,而不是在IDE中启用调试并使用IDE的调试器连接到注释处理器 如果直接运行javac,可以通过指定以下额外参数进行调试: javac -J-Xdebug -J-Xrunjdwp:transport=dt_socket,

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


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

我发现以下资源可以帮助您:


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

如果您确实需要调试注释处理器,那么最好从命令行运行注释处理器,而不是在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\u OPTS
环境变量:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000


对于所有这些执行,javac、Ant或Maven进程将在实际开始执行之前等待您附加调试器。IntelliJ对此的说明如下。对于Eclipse,.

可以运行
javac
并对其进行调试,如上图所示。然而,在我的例子中,编写完整的类路径是很乏味的,所以我想把这留给我的想法。因此,在我想要应用注释处理器的模块中,只需使用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的AppServer在其类路径上需要这个JAR的原因相同——它们需要编译器

然后只需为运行配置设置适当的工作目录(这样java文件的相对路径是正确的),将断点设置到处理器中,并根据需要进行调试


好处类路径已经由IDEA设置,并由“内部”javac使用,因为这里它不是一个单独的过程。我相信也可以将其转换为其他IDE。

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


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

遵循以下步骤,这些步骤在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) .Run最近创建的运行配置APT

4) 。在注释处理代码中添加断点,并为Maven项目构建整体项目,这对我来说非常有用,它更详细地解释了以下步骤:

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

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

  • 运行运行配置。要在进程退出后启动新会话,请重复(2)


  • 请记住,当项目的依赖项发生变化时(例如,如果注释处理器位于与调试它的项目不同的工件中),请在项目的依赖项上运行
    mvn install

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

    简单版 (从终端运行编译并从IDE附加)

  • [必需]添加新的项目配置“+”->“远程”。选中“仅单个实例”。所有其他设置将自动生成。将
    保留为类路径。端口应保留为默认值5005
  • [必需]通过调用:
    /gradlew--stop
  • [必需]运行命令:
    /gradlew--no daemon-Dorg.gradle.debug=true:app:clean:app:compileDebugJavaWithJavac
  • 以调试模式尽快运行APT项目配置:)

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

  • 扩展版(使用gradle.properties)

  • 将以下内容添加到您的gradle.properties文件中:
  • 记住后台处理的“&”符号

  • 转到我们在步骤1中创建的APT配置设置,并在启动配置之前添加一个。选择运行外部工具
  • 将路径添加到前面创建的compile.sh脚本中

  • 警告

    混乱的gradle编译、编译过程中的空指针异常等有时会导致AndroidStudio被卡住(冻结在gradle刷新阶段)。如果无法从IDE中停止gradle,请在终端中使用以下命令:

    ps -A | grep gradle | awk '{ print $1; }' | xargs kill -9
    
    在项目刷新期间关闭调试选项
    有时会帮助Android Studio回到正确的轨道。

    使用IntelliJ IDEA和Gradle调试注释处理器
  • 设置自定义虚拟机选项ps -A | grep gradle | awk '{ print $1; }' | xargs kill -9