2011-12-21 170 views
25

最好使用IDEA IntelliJ。我嘗試在處理器內部設置一個斷點並運行,但沒有中斷。如何使用intellij調試java註釋處理程序?

+0

你是如何運行它的? – jmg 2011-12-21 08:49:58

+0

我剛啓動一個什麼都不做的主類。我已經啓用了註釋處理,如[這裏]所述(http://blogs.jetbrains.com/idea/tag/annotation-processing/)。 – akula1001 2011-12-21 09:08:12

+1

@ manu1001,這將不起作用,因爲註釋處理器在編譯器運行之前正在運行。然後你啓動JVM並嘗試調試它。您可以調試應用程序代碼,但不能在註釋處理器中發生什麼。 – AlexR 2011-12-21 10:36:19

回答

28

如果您確實需要調試註釋處理器,最好從命令行運行註釋處理器,而不是在啓用了調試的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說明書是here。對於Eclipse,here

+1

另請參閱如何完成AndroidAnnotations的處理器[此處](http://www.pingtimeout.fr/2012/10/debugging-annotation-processor-in-every.html),文章解釋瞭如何調試註釋處理器在每個IDE中。 – 2013-04-11 08:08:38

+0

哇!優秀的答案!非常感謝你! – dmoebius 2013-04-22 08:19:46

+0

-Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = y,address = 8000適用於IntelliJ – LostSalad 2013-10-07 13:20:16

7

可以運行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的appservers在他們的類路徑中需要這個JAR的原因相同 - 他們需要編譯器。

然後,只需爲您的運行配置設置適當的工作目錄(以便java文件的相對路徑是正確的),將您的斷點設置到處理器並根據您的意願進行調試!

好處 - classpath已由IDEA設置,並由「內部」javac使用,因爲這裏不是一個單獨的過程。我相信也可以將它翻譯成其他IDE。

+0

我剛剛經歷了這個過程,我更喜歡這個解決方案,因爲它使用了-processor標誌,它拋出了比--processorpath或-cp javac調試路由。我的問題原來是我製作的課程文件與我運行它們的地方不兼容。 – PaulR 2015-12-15 01:11:49

+0

雖然我知道這些評論沒有多大價值,但這確實是我最終做的事情(將JDK \ libs \ tools.jar添加到項目中作爲依賴項併爲該文件執行javac「」c:/開發/ HomeProjects/funky-apt/src/main/java/com/zhuinden/App.java「(絕對路徑)),我確實可以調試我的註釋處理器。很好的答案。 – EpicPandaForce 2017-04-10 12:39:03

2

註釋處理髮生在編譯過程中,所以正常的調試將不起作用。如果您想在項目環境中對其進行調試,則可以在調試模式下使用Gradle或Maven時使用IntelliJ遠程調試。然後,您可以在註釋處理器的文件中放置斷點。

參見Debugging an Annotation Processor in any project

聲明:我寫了這篇文章。

12

按照以下步驟,這些工作對我來說在Android工作室gradle這個項目: -

1)。在gradle.properties加上下面幾行

​​

2).Edit構建配置和添加遠程Configration enter image description here

3).Run最近創建的運行配置APT。

4)。新增打破註釋處理代碼點,並建立整個項目

+1

創建配置後,我得到一個「無法找到或加載主類agentlib:jdwp [...]」的錯誤,我不知道爲什麼。 – Dabbler 2016-09-18 11:01:15

+2

錯過的步驟是從cmd'./gradlew.bat app:compileDebugJavaWithJavac --debug'運行javac任務,然後立即從IDE啓動創建的配置任務。 – Pedram 2017-02-01 13:44:12

0

對於Maven項目,this post,該解釋更詳細一點下面的步驟,爲我工作:

  1. 添加「遠程」運行配置並將「端口」設置爲8000.

  2. 從項目目錄(在命令行中)發出命令mvnDebug clean install

  3. 運行運行配置。爲了在進程退出後開始新的會話,請從(2)開始重複。

記住要在項目的依賴運行mvn install當他們改變(例如,如果註解處理器在不同的神器比項目正在從調試它)。

6

本教程適用於Android項目。與往常一樣,主要模塊名稱爲「app」。該項目包含一個子模塊,稱爲「註釋」,它是「app」的子依賴項。 「app」模塊使用gradle聲明運行註釋處理 apt project(':annotation')

簡易型 (從終端運行彙編和IDE附加)

  1. [REQUIRED]添加新的項目配置「+」 - > 「遠程」。檢查「僅限單一實例」。所有其他設置都是自動生成的。將<whole project>作爲類路徑。端口應保留爲默認值。

enter image description here

  • [必需]請確保您可以通過調用停止所有gradle這個實例:./gradlew --stop
  • [必需]運行命令:./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac
  • enter image description here

    1. 運行APT項目conf iguration在調試模式下儘可能快地:)

    enter image description here


  • [HINT]我們先從一個EMPTY gradle.properties文件
  • [提示]請勿使用gradle 守護進程(--no-daemon/org.gradle.daemon = false選項)
  • [提示]運行gradle debug模式(org.gradle.debug = true選項)
  • [提示]運行應用程序的模塊編譯不是處理器的模塊編譯(應用程序的編譯運行註釋處理!)
  • 我們通常不會在添加任何Java編譯器設置Android Studio(即文件 - >其他設置 - >默認設置)

  • 加長版(使用gradle.properties

    1. 以下內容添加到您的gradle.properties文件:
     
    
        org.gradle.daemon=false 
        org.gradle.debug=true 
    
    
  • 運行從終端彙編:
  • ./gradlew :app:clean :app:compileDebugJavaWithJavac

    enter image description here


    高級版本(只需按調試在IDE)

    1. 將bash腳本添加到您的專業版主目錄(例如compile.sh
     
    #!/bin/bash 
    ./gradlew :app:clean :app:compileDebugJavaWithJavac & 
    

    記住有關後臺處理 '&' 的標誌。

    1. 轉到我們在步驟1中創建的APT配置設置並添加一個在啓動配置之前。選擇運行外部工具

    enter image description here

  • 添加的路徑我們先前創建的compile.sh腳本。
  • enter image description here


    警告

    了雜亂無章的gradle編譯,空指針異常編譯等過程中有時會造成AndroidStudio被卡(在冷凍的gradle刷新階段)。如果你不能停止gradle這個從IDE然後在終端使用這個命令:

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

    項目刷新期間關閉調試選項有時幫助Android Studio中回來了正軌。