这套微服务没有把 Java 版本当成随手可选的参数,而是明确固定在 Java 21。它决定了编译产物、Spring Boot 4 的运行要求、GC 行为、虚拟线程能力,以及测试工具链要支持的字节码版本。
一、版本只写在一处
<properties>
<java.version>21</java.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/pom.xml
父 POM 统一约束版本,业务模块不再各自声明。这对多模块项目很重要:一旦某个模块悄悄用不同字节码版本编译,部署时经常要到运行期才暴露。
二、它影响的不只是语法
Java 21 在这个项目里至少承担四件事:
- 支撑 Spring Boot 4.1 和当前依赖链的最低运行要求。
- 让 JaCoCo、Mockito、ByteBuddy 这类字节码工具明确适配目标。
- 保留使用虚拟线程、record、模式匹配等语言能力的空间。
- 让所有服务和 MP-Generator 共享同一套 JDK 认知,减少本机环境差异。
三、项目里的取舍
项目没有为了“新”而全面使用 Java 21 语法,而是先把它作为稳定基线。业务代码里更多还是清晰的面向对象写法;record 主要出现在网关这类边界模型上。这个顺序比较稳:先统一运行环境,再逐步吸收语言特性。
四、避坑点
- 本机
java -version和 Maven 使用的 JDK 可能不是同一个。 - IDEA 的 Project SDK、Module Language Level、Maven Runner JDK 要一致。
- 升级依赖时要确认其是否支持 Java 21 字节码。
- 打包后的机器也要使用 JDK 21+,不要只保证编译机正确。
五、经验总结
Java 21 是整套工程的地基。它带来的价值不是某个单点语法,而是让框架、构建、测试和部署都围绕同一个运行时版本形成闭环。