加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 与Checker Framework一起使用自定义注释处理器

发布时间:2020-12-15 02:15:40 所属栏目:Java 来源:网络整理
导读:我正在开发一个基于多模块maven的项目,其中一个模块包含一些注释处理器,用于其他模块使用的自定义注释.当我将注释处理器模块的依赖项添加到任何其他模块时,那些注释处理器将处理该模块的注释. 但最近我集成了Checker Framework(用于类型注释),然后所有自定义
我正在开发一个基于多模块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”停止工作.

解决方法

要了解此问题,您必须了解 javac如何找到注释处理器.

如果不为javac提供–processor参数(请参阅doc-javac-options),则会激活注释处理器自动发现功能(请参阅javac-doc: Annotation processing).这意味着,javac将在类路径中搜索所有可用的注释处理器(如果已指定,则为processorpath).
包含META-INF / services / javax.annotation.processing.Processor文件的Jars可以指定其注释处理器类,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检查器).

例如.如果要运行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 Checker auto-discovery

“Auto-discovery” makes the javac compiler always run a checker plugin,
even if you do not explicitly pass the -processor command-line option.
This can make your command line shorter,and ensures that your code is
checked even if you forget the command-line option.

To enable auto-discovery,place a configuration file named
META-INF/services/javax.annotation.processing.Processor in your
classpath. The file contains the names of the checker plugins to be
used,listed one per line. For instance,to run the Nullness Checker
and the Interning Checker automatically,the configuration file should
contain:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读