2016-07-13 31 views
3

我工作的一個多模塊的Maven基於項目中的一個模塊包含了其他模塊使用的自定義註釋的幾個註解處理器。當我將註釋處理器模塊的依賴項添加到任何其他模塊時,那些模塊的註釋將由這些註釋處理器處理。使用自定義註解處理器,與檢查框架

但最近我綜合Checker Framework(類型註釋),然後所有的自定義註解處理器(我上面提到的)停止工作。非常感謝如何讓他們即使使用Checker Framework也能工作的想法?


要清除的情況下,

比方說,我有一個名爲module_A行家模塊。在這個模塊中,我有一個名爲「@FoodItem」的註解(類級別)。我需要強制執行一條規則,即任何使用「@FoodItem」註釋標註的類都應該實現接口「Food」。所以我在處理這些類的相同模塊(module_A)中編寫了一個註釋處理器「FoodItemAnnotationProcessor」,並檢查是否符合該規則。

然後讓我們說我有一個名爲module_B另一個模塊具有行家依賴於module_A。在這個模塊中,我有一個名爲「Pizza」的類,該類使用「@FoodItem」註釋進行註釋。

如果使用上述配置構建項目(具有module_A和module_B),則在編譯階段執行「FoodItemAnnotationProcessor」,並驗證上述規則的類「Pizza」。

之後我集成檢查器框架module_B(如所提到的here)。然後,檢查器框架相關的驗證在編譯時按預期執行,但「FoodItemAnnotationProcessor」停止工作。

+0

您可以提供關於您的設置的更多細節,或者(最好是!)一個最小的工作示例? – mernst

+0

添加了對場景的描述 –

+0

您引用的指令的第3步包含一個代碼片段,其中包含註釋「<! - 添加您希望在此處啓用的所有檢查器 - >'。你在那裏加入了FoodItemAnnotationProcessor嗎? – mernst

回答

0

要了解你必須知道如何javac找到您的註解處理器的問題。

如果你不提供爲javac --processor參數(見doc-javac-options),那麼註釋處理器自動發現功能(見javac-doc: Annotation processing)被激活。這意味着,javac將搜索classpath(或processorpath,如果已指定)中的所有可用註釋處理器。
罐,其中包括一個META-INF/services/javax.annotation.processing.Processor文件,可以指定自己的批註處理器類和javac會自動使用它們。

「問題」是檢查器框架具有多個用於檢查的多個註釋處理器,但您可能只想使用其中的一些:因此註釋 - 發現過程無法使用,您必須手動指定所有註釋處理器在您的構建文件中運行。

對於Maven構建,你可以做這樣的:checker-framework doc for Maven

<annotationProcessors> 
    <!-- Add all the checkers you want to enable here --> 
    <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor> 
</annotationProcessors> 

這將明確設置爲javac --processor參數(見doc-javac-options),禁用默認註解的發現過程。

所以解決方案是手動添加所有您要運行的註釋處理器(除了檢查器框架檢查器)。

E.g.當你想運行NullnessCheckerDagger,必須指定:

<annotationProcessors> 
    <!-- Add all the checkers you want to enable here --> 
    <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor> 
    <!-- Add all your other annotation processors here --> 
    <annotationProcessor>dagger.internal.codegen.ComponentProcessor</annotationProcessor> 
</annotationProcessors> 

提示:
找出目前正在使用的註解處理器,運行構建,並通過非標準選項-XprintProcessorInfo到的javac 。

UPDATE

的跳棋也支持某種形式的自動發現(doc-ref)的 - 注:我還沒有使用過這一點。

2.2.3檢查自動發現

「自動發現」使得javac編譯器始終運行檢查插件, 即使你沒有明確傳遞-processor命令行選項。 這可以使您的命令行更短,並確保即使您忘記了命令行選項,也會檢查您的代碼是否爲 。

要啓用自動發現,請將名爲 META-INF /服務/ javax.annotation.processing.Processor一個配置文件中的類路徑 。該文件包含的檢查器插件的名稱爲 ,每行列出一個。例如,要自動運行NULL的含量檢查 和實習檢查,配置文件應包含 :

org.checkerframework.checker.nullness.NullnessChecker
org.checkerframework.checker.interning.InterningChecker