0.前言
注释处理是一项编译时功能,其中 javac 扫描要编译的源文件中的注释,然后扫描类路径以查找匹配的注释处理器,以便它们可以生成源代码。在 JDK 22 之前,此功能默认启用,当它在 2006 年左右的 JDK 6 中引入时,这可能是合理的,但从当前的角度来看,为了使构建输出更可靠,以防止注释处理器被无意中放置在类路径上,这不太合理。因此,从 JDK 23 开始,javac 需要一个额外的命令行选项来启用注释处理。
1.新-proc参数值
-proc:{policy}扩展了预先存在的选项,{policy}现在可以具有以下值:
- none:编译时不进行注释处理 - 此策略自 JDK 6 开始存在
- only:无需编译即可处理注释 - 此策略自 JDK 6 开始存在
- full:注释处理后再进行编译 - 此策略是 JDK ≤22 中的默认策略,但该值本身是新的(请参阅下一部分了解支持它的版本)
直到 JDK 22 为止,需要在编译之前进行注释处理的代码库可以依赖 javac 的默认行为来处理注释,但现在情况已不再如此。从 JDK 23 开始,至少需要有一个注释处理命令行选项。如果没有使用-processor,–processor-path,–processor-module-path 或proc:only,–proc:full或-proc:none必须提供。换句话说,如果没有其他命令行选项,则在 JDK 23 上是默认的。
2.迁移至-proc:full
采取了多项措施帮助项目做好以下转换-proc:full的准备:
- 自 2024 年 4 月 JDK 安全更新以来,对-proc:full的支持已反向移植到 Oracle JDK 和 OpenJDK 发行版的 17u (17.0.11) 和 11u (11.0.23)。此外,Oracle 的 8u 版本 (8u411) 也支持-proc:full。
- 从 JDK 21 开始,如果检测到默认策略下注释处理的隐式使用,javac 会打印一条信息消息。
通过-proc:full反向移植,可以配置一个在 javac 的默认策略更改之前和之后能够以相同方式运行的构建。