质量外联预警 - JDK 23:更改默认注解处理策略

The OpenJDK 质量小组 正在推广使用 OpenJDK 构建测试 FOSS 项目,以提高发布版本的整体质量。此预警是发送给相关项目的 定期沟通 的一部分。要了解有关该计划的更多信息以及如何加入,请查看 此处.

JDK 23:更改默认注解处理策略

注解处理是一种编译时功能,javac 会扫描要编译的源文件以查找注解,然后扫描类路径以查找匹配的注解处理器,以便它们可以生成源代码。在 JDK 22 之前,此功能默认启用,这在它于 2006 年左右的 JDK 6 中引入时可能是合理的,但从当前的角度来看,为了使构建输出对意外放置在类路径上的注解处理器更加健壮,这就不那么合理了。因此,从 JDK 23 开始,javac 需要额外的命令行选项来启用注解处理。

新的 -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 上的默认值。

迁移到 -proc:full

采取了多项措施来帮助项目为切换到 -proc:full 做好准备

  • 从 2024 年 4 月的 JDK 安全更新开始,对 -proc:full 的支持已回溯到 17u(17.0.11)和 11u(11.0.23),适用于 Oracle JDK 和 OpenJDK 发行版。此外,Oracle 的 8u 版本(8u411)也支持 -proc:full
  • 从 JDK 21 开始,如果检测到在默认策略下隐式使用注解处理,javac 会打印一条信息性消息。

通过将 -proc:full 回溯,可以配置一个在 javac 默认策略更改之前和之后都能正常工作的构建。

更多详细信息

这是一个摘要,有关更多详细信息,请务必阅读 原始提案.

~