簡體   English   中英

指定注釋處理器的順序

[英]Specifying order of annotation processors

我正在嘗試在我的 Java 項目上運行 Dagger 2 和 Lombok。 當然,龍目島必須先運行,但它是否真的運行似乎取決於機會。 起初我懷疑我可以通過類路徑中庫 jar 的相應位置來指定順序,但該順序顯然被忽略了。

有沒有辦法指定它們以某種方式運行的順序,或者我是否只能忍受無法組合兩個 AP?

我已經制作了一個SSCCE 測試用例

一個簡單的git clone & mvn compile就足以說明這個問題——如果你在 App.java 中注釋第 18 行並取消注釋第 20-21 行,它將編譯,即使第 18 行中的 Lombok 符號創建了一個相同的構造函數。 問題是 Lombok 似乎在追趕 Dagger。

經過大量研究並與一位 Lombok 開發人員交談后,發現由於 javac 基於 hashCode() 進行類加載,因此在這種情況下運行的注解處理器的順序本質上是隨機的,更糟糕​​的是,多個運行。 目前似乎沒有解決此問題的方法。

我使用了 lombok-maven 插件並對整個事情進行了 delomboking,這並不完美,而且有點笨拙,但至少產生了一個工作結果。 希望它可以幫助未來的谷歌員工來到這里,我將工作版本提交給了 repo。

理想情況下,順序應該無關緊要。 注釋處理器應該只創建文件 - 每當創建一個文件時,就會開始另一輪處理,其他處理器有機會再次對新文件進行處理。 在這種情況下,順序並不重要,所以我認為沒有官方的方法來強制處理處理器的順序。 問題在於 Lombok 處理器操作現有文件而不是創建新文件,這是它不應該做的。 一些編譯器可能有一個選項來排序處理器或使用處理器加載或出現在命令行參數中的順序,但這將取決於編譯器的實現。

您可以嘗試查看 Daggers 和Lombok 的構建過程,看看那里調用了哪些處理器。 然后以正確的順序在您的 Maven 構建中顯式設置這些處理器並測試不同的編譯器並查看它們中是否有任何一個按此順序運行它們。

如有必要,您可以拆分編譯過程並首先使用-proc:only運行 Lombok,然后在沒有 Lombok 的情況下執行另一個編譯步驟並且不覆蓋操作的文件(如果可能,我從未嘗試過)。

可以使用-processor標志在 javac 中指定注釋處理器的順序。 但是,即使設置了這個參數,我也沒有得到編譯。 我懷疑dagger直接看源碼,或者注解處理器API在同一輪調度注解處理器,lombok的修改沒有傳播。

我認為現在最強大的解決方案是使用delombok強制命令。

披露:我是龍目島的開發人員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM