我有一個註釋處理器,用於保留策略= SOURCE的註釋。如何在編譯期間逐步調試註解處理器?
我不知道如何進行調試。
我已經發出打印報表,記錄信息,當我運行mvn安裝,編譯或包或螞蟻javac和我看到他們sysouts在編譯日誌。
但是,我不知道如何在Eclipse中逐步調試處理器。我的意思是,你如何逐步調試編譯時間?
我有一個註釋處理器,用於保留策略= SOURCE的註釋。如何在編譯期間逐步調試註解處理器?
我不知道如何進行調試。
我已經發出打印報表,記錄信息,當我運行mvn安裝,編譯或包或螞蟻javac和我看到他們sysouts在編譯日誌。
但是,我不知道如何在Eclipse中逐步調試處理器。我的意思是,你如何逐步調試編譯時間?
你必須調用Eclipse中的Java編譯器,使用調試配置(您需要手動創建配置,從「調試配置...」菜單選項。
的「在JDK 1.6或更高版本中調用Java編譯器的方法是使用javax.tools中的JavaCompiler接口,該接口從ToolProvider(包含所有鏈接,因爲您需要閱讀大量的類/包文檔)中獲得。
「快速和骯髒」的方式(即應該工作,但我沒有保證)是調用com.sun.tools.javac.Main.main()
,將它傳遞給你的普通命令行參數。爲此,您需要在類路徑上使用tools.jar
(它位於$JAVA_HOME/lib
)。
的選項在近代是使用類似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從中獲取元素和類型實用程序類,以便以更獨立的方式測試編譯器中的特定邏輯。
註釋處理髮生在編譯期間,所以正常的調試將不起作用。如果您想在項目環境中對其進行調試,則可以在調試模式下使用Gradle或Maven時使用Eclipse遠程調試。然後,您可以在註釋處理器的文件中放置斷點。
參見Debugging an Annotation Processor in any project。
聲明:我寫了這篇文章。
嗨,讀這個答案爲接受,讓我覺得這是一個解決問題的辦法。順便說一下,我不明白「從Eclipse調用Java編譯器,使用調試配置(您需要手動創建配置,從」調試配置「。」的意思是,你能解釋得更好嗎?謝謝 – Apperside
我將tools.jar和處理器jar添加到了一個已存在的項目中,然後按照建議使用了com.sun.tools.javac.Main類。在classpath中創建了一個Java應用程序調試配置,其中包含tools.jar,javac參數作爲程序參數,像魅力一樣工作 - 謝謝! – wbdarby