Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Checker框架旁使用自定义注释处理器_Java_Maven_Annotation Processing_Checker Framework - Fatal编程技术网

Java 在Checker框架旁使用自定义注释处理器

Java 在Checker框架旁使用自定义注释处理器,java,maven,annotation-processing,checker-framework,Java,Maven,Annotation Processing,Checker Framework,我正在从事一个基于多模块maven的项目,其中一个模块包含一些注释处理器,用于其他模块使用的自定义注释。当我将注释处理器模块的依赖项添加到任何其他模块时,这些模块的注释由这些注释处理器处理 但最近我集成了(用于类型注释),然后所有自定义注释处理器(我在上面提到)都停止工作。任何关于如何让它们在使用Checker框架的情况下工作的想法都是非常值得赞赏的 为了消除这种情况 假设我有一个名为module_a的maven模块。在这个模块中,我有一个名为“@FoodItem”的注释(类级别)。我需要强制

我正在从事一个基于多模块maven的项目,其中一个模块包含一些注释处理器,用于其他模块使用的自定义注释。当我将注释处理器模块的依赖项添加到任何其他模块时,这些模块的注释由这些注释处理器处理

但最近我集成了(用于类型注释),然后所有自定义注释处理器(我在上面提到)都停止工作。任何关于如何让它们在使用Checker框架的情况下工作的想法都是非常值得赞赏的


为了消除这种情况

假设我有一个名为module_a的maven模块。在这个模块中,我有一个名为“@FoodItem”的注释(类级别)。我需要强制执行一条规则,任何带有“@FoodItem”注释的类都应该实现接口“Food”。因此,我在同一个模块(module_A)中编写了一个注释处理器“foodItemAnotationProcessor”,用于处理此类类并检查是否符合该规则

然后,假设我有另一个名为module_B的模块,它对module_a具有maven依赖性。在这个模块中,我有一个名为“Pizza”的类,它用“@FoodItem”注释

如果构建项目(包含模块a和模块B)时使用上述配置,则在编译阶段执行“FoodItemAnotationProcessor”,并验证类“Pizza”是否符合上述规则


之后,我将Checker框架集成到模块_B(如上所述)。然后,按照预期在编译时执行与checker框架相关的验证,但“FoodItemOntationProcessor”停止工作。

要理解这个问题,您必须知道如何找到注释处理器

如果不为javac提供
--processor
参数(请参阅),则会激活注释处理器自动发现功能(请参阅)。这意味着,javac将在
类路径
(或
处理器路径
,如果您指定了它)中搜索所有可用的注释处理器。
JAR包含一个
META-INF/services/javax.annotation.processing.Processor
文件,可以指定它们的注释处理器类,javac将自动使用它们

“问题”是checker框架有多个用于检查的注释处理器,但您可能只想使用其中的一些:因此无法使用注释发现过程,您必须手动指定要在生成文件中运行的所有注释处理器

对于Maven构建,您可以这样做:

提示:
要找出当前使用的注释处理器,请运行构建并将非标准选项
-XprintProcessorInfo
传递给javac

更新

checker还支持某种类型的自动发现()-注意:我还没有使用它

2.2.3检查程序自动发现

“自动发现”使javac编译器始终运行检查器插件, 即使没有显式传递-processor命令行选项。 这可以使命令行更短,并确保代码更简洁 即使忘记了命令行选项,也会选中此选项

要启用自动查找,请放置名为的配置文件 应用程序中的META-INF/services/javax.annotation.processing.Processor 类路径。该文件包含要创建的检查器插件的名称 已使用,每行列出一个。例如,运行空值检查器 和实习检查器自动,配置文件应 包含:

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


您能否提供有关设置的更多详细信息,或者(最好!)一个最简单的工作示例?添加了对场景的描述。您引用的说明的步骤3包括一个带有注释的代码段
。你有没有包括FoodItemAnotationProcessor?
<annotationProcessors>
  <!-- Add all the checkers you want to enable here -->
  <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor>
</annotationProcessors>
<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>