JDK21(2023年)中Java应使用哪个@Nullable注解?
关于JDK17/JDK21中@Nullable注解的选择
核心结论
优先使用jakarta.annotation.Nullable,而非旧的javax.annotation.Nullable,同时可结合项目依赖的静态分析工具/IDE生态保持注解一致性。
注解的版本与迁移背景
javax.annotation.Nullable最早源自JSR-250规范,属于Java EE时代的API,JDK本身从未内置该注解。它的引入版本对应Java EE 5,依赖包为javax.annotation:javax.annotation-api:1.3.2。- 随着Java EE迁移至Jakarta EE,原
javax.*命名空间的注解全部迁移到jakarta.*下,jakarta.annotation.Nullable是官方替代版本,从Jakarta EE 9开始正式启用,完全兼容JDK17及以上版本(包括JDK21),且处于持续维护状态。 - JDK本身没有内置官方的@Nullable注解,Java的空值检查主要依赖静态分析工具(如SpotBugs、Checkstyle)或IDE(IntelliJ IDEA、Eclipse)的支持,这些工具大多同时兼容
javax和jakarta版本的注解,但jakarta版本是当前生态的标准方向。
不同场景的选择建议
1. 普通Java项目(非EE)
直接引入Jakarta Annotations API依赖(以Maven为例):
<dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> <version>2.1.1</version> <scope>provided</scope> </dependency>
导入路径:import jakarta.annotation.Nullable;
该版本完全适配JDK17和JDK21,是当前最标准的选择。
2. 遗留Java EE项目
若项目暂时无法迁移至Jakarta EE,javax.annotation.Nullable仍可使用,但需注意:它的依赖包已停止维护,未来JDK版本可能出现兼容性问题,建议逐步迁移到jakarta版本。
3. 结合生态工具使用
如果项目已依赖特定生态(如Spring、IntelliJ IDEA的静态检查),可以继续使用对应生态的@Nullable注解(如org.springframework.lang.Nullable、org.jetbrains.annotations.Nullable),但需保持项目内注解的一致性,避免混用。
关键注意点
- JDK17和JDK21均未内置@Nullable相关注解,必须依赖第三方API包。
- 选择
jakarta.annotation.Nullable的核心原因是它属于Jakarta EE官方规范的延续,是当前Java生态的标准注解,具备更好的兼容性和未来适配性。
内容的提问来源于stack exchange,提问作者Paul Verest on LinkedIn
相关产品推荐
相关产品推荐

