我正在嘗試使用(我自定義的)注解處理器生成類。(我使用的是spring-boot和maven) 例如
@Matcher
public class A{...}。
應該生成
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
public class AMatcher extends TypeSafeMatcher<A>{.}。
然而,當我生成檔案時,它在package org.hamcrest does not exist錯誤中失敗。
由于注釋處理器首先運行,我的第一個猜測是classPath沒有被設定,所以它不能找到包。
但是我在使用注解處理器方面沒有什么經驗,所以我不確定是否是這種情況。
什么原因會導致這個錯誤,以及如何解決這個問題的合法方法是什么?(如果可能的話)
檔案的結構
src
main
java
淘寶網
測驗專案
啟用
A.java
生成檔案的結構
target
生成的資源
注釋
com
testProject
控制元件
AMatcher.java
謝謝你的幫助!
uj5u.com熱心網友回復:
我的第一個猜測是,classPath沒有被設定,所以它不能找到包。
并非如此。
一個注釋處理器只是踢出一個文本檔案。在 "創建時間",即當注釋處理器創建這個檔案時,它只是一個文本檔案;它根本沒有被決議為源檔案,因此,在這個階段,classpath 的任何東西都不可能適用于這個檔案。
由于該處理器制作了檔案,編譯器意識到現在存在新的源檔案,所以它重新開始編譯(但有點智能,不一定要重新處理所有檔案)--這就是 "輪子 "系統,以及RoundEnv在注釋處理器中的作用。在 "第一輪 "編譯運行中的檔案甚至完全沒有意義,直到一些APs制作了檔案,在這種情況下,這些第一輪的檔案在第二輪中被編譯。換句話說,javac甚至會推遲 "未找到 "性質的錯誤,比如你得到的那個錯誤,直到處理結束。
應用于any輪的classpath也不例外,是完整的編譯classpath。
因此,最可能的解釋是 hamcrest(或 junit)根本就不在 classpath 上。可能你的路徑上只有junit jar,而沒有junit的暫存器(這里是org.hamcrest)。
一個好的下一步是暫時忘掉注釋,把你的AP所做的檔案寫成實際的非生成的源檔案(只是現在,為了測驗和解決這個問題),你會發現你得到同樣的錯誤,從而表明這與AP無關。即使你把整個AP從路徑上移開/在這一點上禁用AP處理。
。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327627.html
標籤:
