2012-10-04 33 views
9

我有一個註釋處理器,用於保留策略= SOURCE的註釋。如何在編譯期間逐步調試註解處理器?

我不知道如何進行調試。

  • 我已經發出打印報表,記錄信息,當我運行mvn安裝,編譯或包或螞蟻javac和我看到他們sysouts在編譯日誌。

  • 但是,我不知道如何在Eclipse中逐步調試處理器。我的意思是,你如何逐步調試編譯時間?

回答

5

你必須調用Eclipse中的Java編譯器,使用調試配置(您需要手動創建配置,從「調試配置...」菜單選項。

的「在JDK 1.6或更高版本中調用Java編譯器的方法是使用javax.tools中的JavaCompiler接口,該接口從ToolProvider(包含所有鏈接,因爲您需要閱讀大量的類/包文檔)中獲得。

「快速和骯髒」的方式(即應該工作,但我沒有保證)是調用com.sun.tools.javac.Main.main(),將它傳遞給你的普通命令行參數。爲此,您需要在類路徑上使用tools.jar(它位於$JAVA_HOME/lib)。

+0

嗨,讀這個答案爲接受,讓我覺得這是一個解決問題的辦法。順便說一下,我不明白「從Eclipse調用Java編譯器,使用調試配置(您需要手動創建配置,從」調試配置「。」的意思是,你能解釋得更好嗎?謝謝 – Apperside

+0

我將tools.jar和處理器jar添加到了一個已存在的項目中,然後按照建議使用了com.sun.tools.javac.Main類。在classpath中創建了一個Java應用程序調試配置,其中包含tools.jar,javac參數作爲程序參數,像魅力一樣工作 - 謝謝! – wbdarby

6

的選項在近代是使用類似http://github.com/google/compile-testing它可以讓你調用禁止任意註釋處理器,您可以設置斷點編譯工作,步等

@Test public void testStuff() { 
    // Create a source file to process, or load one from disk. 
    JavaFileObject file = JavaFileObjects.fromSourceLines("test.Foo", 
    "package test;", 
    "", 
    "import bar.*;", 
    "", 
    "@MyAnnotation(blah=false)", 
    "interface TestInterface {", 
    " Bar someBar();", 
    "}", 

    // assert conditions following a compilation in the context of MyProcessor. 
    assert_().about(javaSource()).that(file) 
     .processedWith(new MyProcessor()) 
     .failsToCompile() 
     .withErrorContaining("some error message").in(file).onLine(5); 
} 

這個測試期望你會得到一些錯誤消息,因爲在測試數據源中錯誤地聲明瞭@MyAnnotation。如果此斷言失敗,則可以在IDE中以調試模式運行它,在MyProcessor中設置斷點,並在調試過程中使用完整的編譯器環境進行操作。

對於您的處理器中的單元測試您還可以使用@Rule調用CompilationRule從中獲取元素和類型實用程序類,以便以更獨立的方式測試編譯器中的特定邏輯。

2

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

參見Debugging an Annotation Processor in any project

聲明:我寫了這篇文章。