2. 编程语言-JAVA-JDK版本及Spring组件适配
JDK 是 Java开发的核心,每个版本的更新都带来了新的特性和优化。从 JDK 8 的函数式编程到 JDK 17 的长期支持(LTS),再到 JDK 21 的最新性能优化,选择适合的 JDK 版本是开发者必须掌握的技能。
文章目录
前言
JDK版本
JDK 是 Java开发的核心,每个版本的更新都带来了新的特性和优化。从 JDK 8 的函数式编程到 JDK 17 的长期支持(LTS),再到 JDK 21 的最新性能优化,选择适合的 JDK 版本是开发者必须掌握的技能。
一、JDK
- JDK 8(2014年发布)
- 定位:经典稳定,但已过时
- 适用场景:
- 维护老旧企业系统(兼容性优先)
- 传统框架(如Spring Boot 1.x/2.x早期版本)
- 风险提示:
- 官方扩展支持已结束(2025年商用需付费)
- 缺少现代语言特性(如Lambda需手动适配)
- JDK 17(2021年发布,LTS)
- 定位:平衡稳定与现代特性
- 优势:
- 免费商用(OpenJDK生态成熟)
- 支持 密封类(Sealed Classes)、模式匹配 等新特性
- 性能优化(ZGC/Shenandoah垃圾回收器)
- 适用场景:
- 企业新项目(Spring Boot 3.x默认支持)
- 需要长期维护的中大型系统
- JDK 21(2023年发布,LTS)
- 定位:最新技术标杆
- 核心升级:
- 虚拟线程(Virtual Threads) - 大幅提升并发性能
- 结构化并发(预览)、分代ZGC等
- 适用场景:
- 高并发微服务、云原生应用
- 希望尝鲜未来Java特性的团队
- JDK版本推荐
- JDK 8(稳定且受欢迎,兼容性至上,但安全风险较高)
- JDK 17(最新稳定版本,现代特性平衡,生态成熟)
- JDK 21(包含最新特性,革命性改进,未来主流,适合新项目)
旧系统 → 尽快脱离JDK 8,经JDK 11过渡至JDK 17
保守选型 → JDK 17(平衡稳定与现代化特性)
激进创新 → JDK 21(虚拟线程+分代ZGC重塑性能标杆)
新项目务必选择LTS版本,避免陷入半年一次的非LTS升级陷阱。
注意:从JDK 17开始,Oracle OpenJDK完全免费商用(无需担心许可证问题),建议优先考虑升级!
- 重要注意事项
-
Oracle OpenJDK ≠ Oracle JDK:
- Oracle提供的OpenJDK构建版免费,但仅6个月更新(非LTS需频繁升级)
- 长期支持需选择第三方发行版(如Temurin/Corretto)
-
ARM架构支持:
- Temurin/Corretto/Zulu均提供ARM64版本(树莓派、Mac M1/M2等适用)
二、服务器
1. Apache Tomcat
- 核心版本对应关系
| Tomcat版本 | 最低JDK要求 | 最高JDK测试版本 | 特性 |
|---|---|---|---|
| 11.0.x | JDK 21 | - | 支持Jakarta EE 10(Servlet 6.0)规范 |
| 10.1.x | JDK 11 | JDK 20 | 支持Jakarta EE 9/10命名空间变更 |
| 9.0.x | JDK 8 | JDK 19 | 支持HTTP/2和WebSocket 1.1 |
| 8.5.x | JDK 7 | JDK 8 | 安全增强且默认关闭AJP协议 |
- 兼容性注意事项
- 命名空间变更:Tomcat 10+将
javax.*包路径改为jakarta.*,可能导致旧项目不兼容。 - 高版本JDK限制:例如Tomcat 11.x仅支持JDK 21及以上,向下兼容性需验证。
- 生产环境建议
-
推荐组合:
- 保守方案:Tomcat 9.0.x + JDK 11(长期支持)。
- 前沿方案:Tomcat 10.1.x + JDK 17(性能优化)。
-
性能调优:JDK 11+建议启用G1GC,JDK 8需配置CMS垃圾回收器。
三、Spring组件
1. Spring Boot 与 JDK 版本对应关系
- Spring Boot 3.x
- 最低要求:JDK 17+(强制要求)
- 推荐版本:JDK 21(LTS版本)
- 特性:基于Spring Framework 6,全面采用Jakarta EE 9+命名空间(javax→jakarta),支持GraalVM原生镜像12。
- Spring Boot 2.7.x
- 支持范围:JDK 8~18
- 生产推荐:JDK 17(LTS版本)
- 特性:增强GraalVM支持,优化Kubernetes部署12。
- Spring Boot 2.6.x及以下
- 2.6.x:JDK 8~17
- 2.5.x:JDK 8~16
- 注意事项:低于2.5.x的版本已停止维护,建议升级13。
2. Spring Boot 与 Spring Cloud 版本对应关系
- Spring Boot 3.x
- Spring Cloud 2023.0.x(如2023.0.1):适配Spring Boot 3.2.x。
- Spring Cloud 2022.0.x(如2022.0.1):适配Spring Boot 3.1.x。
- Spring Boot 2.7.x
- Spring Cloud 2021.0.x(如2022.0.1):适配Spring Boot 2.7.x。
- Spring Boot 2.6.x及以下
- Spring Cloud 2020.0.x(如Hoxton):适配Spring Boot 2.5.x~2.6.x。
- 历史版本:Finchley(2.0.x)、Greenwich(2.1.x)等已逐步淘汰。
3. 兼容性注意事项
- JDK 8用户
- 必须选择 Spring Boot 2.5.x/2.6.x + Spring Cloud 2020.0.x 组合。
- 避免使用Spring Boot 3.x(需JDK 17+)。
-
版本冲突风险
不匹配的版本可能导致依赖解析失败或Bean创建异常(如BeanCreationException)。 -
Spring Cloud Alibaba
- 2023.0.x适配Spring Boot 3.2.x + Spring Cloud 2023.0.x。
- 2021.0.x适配Spring Boot 2.6.x + Spring Cloud 2021.0.x。
4. 版本查询工具
官方文档:Spring Cloud官网 提供最新版本表。
在线查询:访问 https://start.spring.io/actuator/info 格式化后查看 springCloudVersion 字段。
5. 生产环境建议
新项目:Spring Boot 3.2.x + JDK 21 + Spring Cloud 2023.0.x(云原生特性支持)。
旧系统维护:Spring Boot 2.7.x + JDK 17 + Spring Cloud 2021.0.x(平衡兼容性与稳定性)。
6. Spring Boot 2.7.x + JDK 8 + spring-security
1. spring-security-oauth2
- 各版本的名称及发布日期:
| 版本 | 适用 Spring Boot | 适用 Spring Security | 状态 | 备注 |
|---|---|---|---|---|
| 2.5.x | 2.5.x - 2.7.x | 5.5.x - 5.7.x | 维护中 | 推荐稳定版 |
| 2.4.x | 2.4.x - 2.6.x | 5.4.x - 5.6.x | 已弃用 | 建议升级 |
| 2.3.x | 2.3.x - 2.5.x | 5.3.x - 5.5.x | 已弃用 | 不推荐 |
| 2.2.x | 2.2.x - 2.4.x | 5.2.x - 5.4.x | 已弃用 | 仅旧项目 |
| 2.1.x | 2.1.x - 2.3.x | 5.1.x - 5.3.x | 已弃用 | 不推荐 |
- Spring Boot 2.7.x + JDK 8的环境推荐版本
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.5.2.RELEASE</version> <!-- 最新稳定版 -->
</dependency>
- Spring Security 版本匹配
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.7.6</version> <!-- 推荐版本 -->
</dependency>
- 注意事项
-
Spring Security OAuth2 已弃用
- 官方推荐迁移到 Spring Authorization Server(Spring Security 5.7+ 内置)
- 新项目建议直接使用 spring-security-oauth2-authorization-server(Spring Boot 3.x+)
-
JDK 8 兼容性
- Spring Security OAuth2 2.5.x 仍支持 JDK 8
- 如需升级到 Spring Boot 3.x,需切换至 JDK 17+
-
常见问题
- 如果遇到 NoSuchMethodError,检查依赖冲突(如旧版 spring-security-jwt)
- 推荐使用 spring-security-oauth2-autoconfigure 简化配置
- 迁移建议
如果计划升级,可参考以下路径:
- 短期方案:继续使用 OAuth2 2.5.x(维护模式)
- 长期方案:迁移到 Spring Authorization Server(需要 Spring Boot 3.x+)
2. spring-security-jwt
-
版本选择
spring-security-jwt 最终稳定版:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.1.1.RELEASE</version> <!-- 官方最后维护版本 -->
</dependency>
- 兼容性说明:
- 需搭配 spring-security-oauth2 2.5.x 使用(如 2.5.2.RELEASE)。
- 不支持 Spring Boot 3.x 或 JDK 17+。
2. 基础配置示例
- JWT 密钥配置
JwtConfig.java
@Configuration
public class JwtConfig {
@Value("${jwt.secret}")
private String secret;
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey(secret); // 设置签名密钥
return converter;
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(jwtAccessTokenConverter());
}
}
-
需在 application.properties 中配置 jwt.secret=your-256-bit-secret。
-
OAuth2 资源服务器配置
ResourceServerConfig.java
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.anyRequest().authenticated();
}
}
3. 生成和解析 JWT 令牌
- 生成令牌(授权服务器端)
JwtTokenEnhancer.java
class JwtTokenEnhancer implements TokenEnhancer {
@Override
public OAuth2AccessToken enhance(
OAuth2AccessToken accessToken,
OAuth2Authentication authentication) {
Map<String, Object> additionalInfo = new HashMap<>();
additionalInfo.put("organization", "example-org");
((DefaultOAuth2AccessToken) accessToken)
.setAdditionalInformation(additionalInfo);
return accessToken;
}
}
- 解析令牌(资源服务器端)
JwtUtils.java
class JwtUtils {
public static Claims extractClaims(String token, String secret) {
return Jwts.parser()
.setSigningKey(secret.getBytes())
.parseClaimsJws(token)
.getBody();
}
}
4. 注意事项
- 密钥安全:
- 替换 JwtAccessTokenConverter 的签名逻辑)。
- 依赖冲突:
- 避免引入 jjwt 旧版本(如 0.9.x),可能引发 NoSuchMethodError。
- 迁移建议:
- 新项目推荐使用 spring-security-oauth2-authorization-server + jjwt 0.12.x。
四、中间件
数据库-Mysql
1. Spring Boot 2.7.X + JDK 8 + MyBatis /MyBatis-Plus
1. 推荐 MyBatis 版本
- mybatis-spring-boot-starter 建议使用 2.2.2 或 2.2.6(最新稳定版)
- 对应 MyBatis 核心版本:3.5.10(推荐)或 3.5.9
- 兼容 JDK 8,且适配 Spring Boot 2.7.X 的自动配置
- MySQL 驱动版本
- 使用 8.0.28 或 5.1.49(取决于 MySQL 服务器版本)
2. 推荐 MyBatis-Plus 版本
- mybatis-plus-boot-starter 建议使用 3.5.3.1 或 3.5.4(适配 Spring Boot 2.7.X)
- 对应 MyBatis 核心版本:3.5.10
- 兼容 JDK 8,且适配 Spring Boot 2.7.X 的自动配置
- MySQL 驱动版本
- 使用 8.0.28 或 5.1.49(取决于 MySQL 服务器版本)
3. 注意事项
- JDK 8 兼容性
- Spring Boot 2.7.X 官方支持 JDK 8,但建议使用 JDK 8u151+ 避免潜在的 JVM 兼容性问题。
- MyBatis 3.5.10 完全兼容 JDK 8。
- MyBatis-Plus 3.5.3.1 和 3.5.4 完全支持 JDK 8,但建议使用 JDK 8u151+ 以避免潜在的 JVM 兼容性问题。
- Spring Boot 2.7.X 官方推荐 JDK 8-17,但 JDK 8 是最稳定的选择。
- MyBatis 3.4.x 版本不推荐
- 部分功能(如 @SelectProvider)可能存在兼容性问题,建议使用 3.5.x 版本。
- 分页插件(PageHelper)
- 如需分页,建议使用 pagehelper-spring-boot-starter(版本 1.4.6 或更高)
4. 总结
- MyBatis Starter 版本:2.2.2 或 2.2.6(最新稳定版)
- MyBatis-Plus Starter 版本:3.5.3.1 或 3.5.4(推荐)
- MyBatis 核心版本:3.5.10(推荐)
- MySQL JDBC 版本:8.0.28(MySQL 8.X)或 5.1.49(MySQL 5.X)
- JDK 版本:JDK 8u151+(确保稳定性)
数据库-Redis
2. Spring Boot 2.7.X + JDK 8 + Redisson
1. 推荐 Redisson 版本
- redisson-spring-boot-starter 建议使用 3.23.2 或 3.24.1(适配 Spring Boot 2.7.X)
- 对应 Redisson 核心版本:3.23.2(推荐)
- 兼容 JDK 8,且适配 Spring Boot 2.7.X 的自动配置
- Redis 客户端依赖
- 使用 lettuce(Spring Boot 2.7.X 默认)或 jedis(需手动配置)
2. 注意事项
- JDK 8 兼容性
- Redisson 3.23.2 和 3.24.1 完全支持 JDK 8,但建议使用 JDK 8u151+ 以避免潜在的 JVM 兼容性问题。
- Spring Boot 2.7.X 官方推荐 JDK 8-17,但 JDK 8 是最稳定的选择。
- Redis 驱动选择
- Lettuce 是 Spring Boot 2.7.X 的默认驱动,性能更好(支持异步、响应式)。
- Jedis 兼容性更好,但需手动排除 Lettuce。
-
分布式锁
-
节点集群配置(可选)
3. 总结
- Redisson Starter 版本:3.23.2(推荐)或 3.24.1
- Redis 驱动:Lettuce(默认)或 Jedis(需排除 Lettuce)
- JDK 版本:JDK 8u151+(确保稳定性)
- Spring Boot 版本:2.7.X
更多推荐
所有评论(0)