我正在开发基于多模块maven的项目,其中一个模块包含一些注释处理器,用于其他模块使用的自定义注释。当我将注释处理器模块的依赖项添加到任何其他模块时,那些注释处理器将处理该模块的注释。
但是最近我集成了Checker Framework(用于类型注释),然后所有自定义注释处理器(我在上面提到)都停止了工作。任何关于如何让它们与Checker Framework一起工作的想法都非常感谢?
要清除方案,
我们说我有一个名为module_A的maven模块。在这个模块中,我有一个名为" @ FoodItem"的注释(类级别)。我需要强制执行任何使用" @ FoodItem"注释的类的规则。注释应该实现界面" Food"。所以我写了一个注释处理器" FoodItemAnnotationProcessor"在同一模块(module_A)中处理此类并检查是否符合该规则。
然后让我说我有另一个名为module_B的模块,它对module_A有一个maven依赖。在这个模块中,我有一个名为" Pizza"用" @ FoodItem"注释。注解。
如果使用上面的配置构建项目(具有module_A和module_B),那么" FoodItemAnnotationProcessor"在编译阶段执行并验证班级"比萨"对于上述规则。
之后我将Checker框架集成到module_B(如上所述here)。然后检查框架相关的验证在编译时按预期执行,但是" FoodItemAnnotationProcessor"停止工作。
答案 0 :(得分:0)
要了解此问题,您必须了解javac如何找到注释处理器。
如果您没有为javac提供--processor
参数(请参阅doc-javac-options),则会激活注释处理器自动发现功能(请参阅javac-doc: Annotation processing)。这意味着,javac将在classpath
(或processorpath
中搜索所有可用的注释处理器(如果已指定)。
包含META-INF/services/javax.annotation.processing.Processor
文件的jar可以指定它们的注释处理器类,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),这将禁用默认的注释发现过程。
所以解决方案是手动添加你想要运行的所有注释处理器(除了checker-framework检查器之外)。
E.g。如果要运行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>
提示:
要找出您当前使用的注释处理器,请运行构建并将非标准选项-XprintProcessorInfo
传递给javac。
更新:
检查器还支持某种自动发现(doc-ref) - 注意:我还没有用过它。
2.2.3检查器自动发现
“自动发现”使javac编译器始终运行检查器插件, 即使您没有显式传递-processor命令行选项。 这可以缩短命令行,并确保您的代码 即使您忘记了命令行选项也要检查。
要启用自动发现,请放置一个名为的配置文件 你的META-INF / services / javax.annotation.processing.Processor 类路径。该文件包含检查器插件的名称 使用,每行列出一个。例如,运行Nullness Checker 和Interning Checker自动配置文件 含有:
org.checkerframework.checker.nullness.NullnessChecker
org.checkerframework.checker.interning.InterningChecker