使用自定义注释处理器和Checker Framework

时间:2016-07-13 09:16:13

标签: java maven annotation-processing checker-framework

我正在开发基于多模块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"停止工作。

1 个答案:

答案 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。如果要运行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。

更新

检查器还支持某种自动发现(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