2016-07-13 10 views
3

Ich arbeite an einem auf mehreren Modulen basierenden Projekt, bei dem eines der Module einige Annotationsprozessoren für die benutzerdefinierten Annotationen enthält, die von anderen Modulen verwendet werden. Wenn ich einem anderen Modul eine Abhängigkeit des Annotationsprozessormoduls hinzufüge, werden die Annotationen dieser Module von diesen Annotationsprozessoren verarbeitet.Verwendung von benutzerdefinierten Annotationsprozessoren neben Checker Framework

Aber kürzlich integrierte ich Checker Framework (für Typ Anmerkungen) und dann alle benutzerdefinierten Annotationsprozessoren (ich oben erwähnt) funktioniert nicht mehr. Irgendeine Idee, wie man sie mit Checker Framework zur Arbeit bringt, wird sehr geschätzt?


das Szenario löschen,

Lassen Sie uns sagen, dass ich ein Maven-Modul mit dem Namen module_A. In diesem Modul habe ich eine Annotation (Klassenstufe) namens "@FoodItem". Ich muss eine Regel erzwingen, dass jede mit "@FoodItem" Annotation versehene Klasse die Schnittstelle "Food" implementiert. Also habe ich einen Annotationsprozessor "FoodItemAnnotationProcessor" im selben Modul (Modul_A) geschrieben, der solche Klassen verarbeitet und auf die Einhaltung dieser Regel prüft.

Dann sagen wir, ich habe ein anderes Modul mit dem Namen module_B, das eine maven-Abhängigkeit zu dem Modul_A hat. In diesem Modul habe ich eine Klasse namens "Pizza", die mit Annotation "@FoodItem" versehen ist.

Wenn das Projekt (das hat modul_A und module_B) mit der obigen Konfiguration erstellt wird, wird der "FoodItemAnnotationProcessor" beim Kompilieren ausgeführt und validiert die Klasse "Pizza" für die oben genannte Regel.

Danach habe ich Checker-Framework zu module_B integriert (wie erwähnt here). Dann werden Checker-Framework-bezogene Validierungen zur Kompilierzeit wie erwartet ausgeführt, aber der "FoodItemAnnotationProcessor" hat aufgehört zu arbeiten.

+0

Können Sie mehr Details über Ihre Einrichtung oder (vorzugsweise!) Ein minimales Arbeitsbeispiel geben? – mernst

+0

Eine Beschreibung des Szenarios –

+0

hinzugefügt Schritt 3 der Anweisungen, auf die Sie verwiesen haben, enthalten ein Code-Snippet mit dem Kommentar ''. Haben Sie FoodItemAnnotationProcessor dort aufgenommen? – mernst

Antwort

0

Um das Problem zu verstehen, müssen Sie wissen, wie javac Ihre Annotation Prozessoren findet.

Wenn Sie das für javac --processor Argument nicht liefern (siehe doc-javac-options), dann wird die Annotation-Prozessor Auto-Discovery-Funktion (siehe javac-doc: Annotation processing) aktiviert. Das bedeutet, dass javac in Ihrem classpath (oder processorpath, falls Sie es spezifiziert haben) nach allen verfügbaren Annotation-Prozessoren sucht.
Jars, die eine META-INF/services/javax.annotation.processing.Processor-Datei enthalten, können ihre Annotation Processor-Klassen angeben und javac wird sie automatisch verwenden. Das "Problem" besteht darin, dass das Checker-Framework mehrere Mehrfachanmerkungs-Prozessoren für die Überprüfungen hat, aber Sie möchten möglicherweise nur einige davon verwenden: Der Annotation-Discovery-Prozess kann daher nicht verwendet werden und Sie müssen alle Annotationen manuell angeben Prozessoren, die in Ihrer Build-Datei ausgeführt werden sollen.

Für eine Maven bauen Sie es wie folgt tun: checker-framework doc for Maven

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

Dies wird das --processor Argument für javac (siehe doc-javac-options) explizit festgelegt, die den Standard-Annotation-Discovery-Prozess deaktiviert.

So die Lösung ist manuell hinzufügen alle Annotationsprozessoren, die Sie (zusätzlich zu den Checker-Framework-Checker) ausführen möchten.

z.wenn Sie die NullnessChecker und Dagger ausführen möchten, müssen Sie beide angeben:

<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> 

Hinweis:
um herauszufinden, welche Anmerkung Prozessoren Sie derzeit verwenden, Ihren Build ausführen und die Nicht-Standard-Option -XprintProcessorInfo zu javac passieren .

UPDATE:

Die Kontrolleure auch eine Art von Auto-Discovery (doc-ref) unterstützen - Anmerkung: Ich habe dies noch nicht verwendet.

2.2.3 Checker Auto-Discovery

„Auto-Discovery“ macht den javac-Compiler immer einen Kontrolleur Plugin laufen, auch wenn Sie nicht explizit die -Prozessor Befehlszeilenoption passieren kann. Dies kann Ihre Befehlszeile verkürzen und stellt sicher, dass Ihr Code überprüft wird, auch wenn Sie die Befehlszeilenoption vergessen.

Um die automatische Erkennung zu aktivieren, platzieren Sie eine Konfigurationsdatei mit dem Namen META-INF/services/javax.annotation.processing.Processor in Ihrem Klassenpfad . Die Datei enthält die Namen der zu verwendenden Checker-Plugins , die pro Zeile aufgelistet sind. Um zum Beispiel die Nullness Checker und die Internierung Checker automatisch ausgeführt wird, sollte die Konfigurationsdatei enthalten:

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

Verwandte Themen