质量外联预警 - JDK 23:更改默认注解处理策略
Nicolai Parlog 于 2024 年 6 月 18 日
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 默认策略更改之前和之后都能正常工作的构建。
更多详细信息
这是一个摘要,有关更多详细信息,请务必阅读 原始提案.