【问题标题】:Using custom annotation processors alongside Checker Framework在 Checker Framework 旁边使用自定义注释处理器
【发布时间】:2016-07-13 09:16:13
【问题描述】:

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

【问题讨论】:

  • 您能否提供有关您的设置的更多详细信息,或者(最好!)一个最小的工作示例?
  • 添加场景描述
  • 您引用的说明的第 3 步包括一个代码 sn-p 和注释 <!-- Add all the checkers you want to enable here -->。您是否在其中包含了 FoodItemAnnotationProcessor?

标签: java maven annotation-processing checker-framework


【解决方案1】:

要了解问题,您必须知道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),这将禁用默认的注释发现过程。

所以解决方案是手动添加您想要运行的所有注释处理器(除了检查器框架检查器)。

例如当你想运行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 和实习检查器自动,配置文件应该 包含:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多