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