java – 与Checker Framework一起使用自定义注释处理器
我正在开发一个基于多模块maven的项目,其中一个模块包含一些注释处理器,用于其他模块使用的自定义注释.当我将注释处理器模块的依赖项添加到任何其他模块时,那些注释处理器将处理该模块的注释.
但最近我集成了Checker Framework(用于类型注释),然后所有自定义注释处理器(我在上面提到)停止工作.任何关于如何让它们与Checker Framework一起工作的想法都非常感谢? 要清除方案, 假设我有一个名为module_A的maven模块.在这个模块中,我有一个名为“@FoodItem”的注释(类级别).我需要强制执行一个规则,任何使用“@FoodItem”注释注释的类都应该实现“Food”接口.所以我在同一模块(module_A)中编写了一个注释处理器“FoodItemAnnotationProcessor”,它处理这些类并检查是否符合该规则. 然后假设我有另一个名为module_B的模块,它具有与module_A的maven依赖关系.在这个模块中,我有一个名为“Pizza”的类,它使用“@FoodItem”注释进行注释. 如果使用上述配置构建项目(具有module_A和module_B),则在编译阶段执行“FoodItemAnnotationProcessor”并验证上述规则的类“Pizza”. 之后,我将Checker框架集成到module_B(如here所述).然后检查框架相关的验证在编译时按预期执行,但“FoodItemAnnotationProcessor”停止工作. 解决方法
要了解此问题,您必须了解
javac如何找到注释处理器.
如果不为javac提供–processor参数(请参阅doc-javac-options),则会激活注释处理器自动发现功能(请参阅javac-doc: Annotation processing).这意味着,javac将在类路径中搜索所有可用的注释处理器(如果已指定,则为processorpath). “问题”是检查器框架有多个多个注释处理器用于检查,但您可能只想使用其中的一些:因此无法使用注释发现过程,您必须手动指定要在其中运行的所有注释处理器你的构建文件. 对于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),该参数禁用默认的注释发现过程. 所以解决方案是手动添加你想要运行的所有注释处理器(除了checker-framework检查器). 例如.如果要运行NullnessChecker和Dagger,则必须同时指定: <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> 暗示: 更新: 检查器还支持某种自动发现(doc-ref) – 注意:我还没有使用它.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |