Spring Boot 2.0 升级至 3.5 JDK 1.8 升级至 17 全面指南
一、版本升级背景
-
升级动机
- Spring Boot 2.0 到 3.5 的重大更新(如Jakarta EE 9+包路径变更、GraalVM支持等)
- JDK 1.8 到 17 的语言特性升级(如sealed class、record等)
- 安全性与性能优化需求
-
升级目标
- 兼容性验证
- 依赖库版本适配
- 代码兼容性修复
二、升级前依赖对比
升级前 POM.xml 核心配置
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version>
</parent><properties><jedis.version>2.9.3</jedis.version><nacos.version>2.1.0</nacos.version><nacos.httpclient.version>4.5.8</nacos.httpclient.version><nacos.springboot.starter.version>0.2.10</nacos.springboot.starter.version>
</properties>
升级后 POM.xml 核心配置
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.3</version>
</parent><properties><java.version>17</java.version><jedis.version>2.9.3</jedis.version><feign.version>12.5</feign.version> <!-- Feign版本适配 --><nacos.version>2.3.2</nacos.version> <!-- Nacos Client升级 --><nacos.httpclient.version>4.5.14</nacos.httpclient.version><nacos.springboot.starter.version>0.3.0-RC</nacos.springboot.starter.version> <!-- 新坐标 -->
</properties>
再补充一个升级后的配置:
<properties><java.version>17</java.version> <!-- 升级JDK版本 --><maven.compiler.release>17</maven.compiler.release><feign.version>12.5</feign.version> <!-- 升级Feign --><log4j2.version>2.23.1</log4j2.version> <!-- 升级Log4j2 --><nacos.version>2.3.2</nacos.version> <!-- 升级Nacos Client --><nacos.httpclient.version>4.5.14</nacos.httpclient.version><nacos.springboot.starter.version>0.3.0-RC</nacos.springboot.starter.version> <!-- 新坐标 --><jackson.version>2.18.2</jackson.version> <!-- 升级Jackson --><netty.version>4.1.122.Final</netty.version> <!-- 升级Netty --><snakeyaml.version>2.2</snakeyaml.version> <!-- 升级SnakeYAML --></properties>
三、升级过程中遇到的问题及解决方案
问题一:Jasypt 解密失败
- 错误表现
- 启动时报
Invalid decryptor configuration
- 启动时报
- 解决方案
- 在启动类添加注解:
@EnableEncryptableProperties
- 补充配置项(
application.yml
):jasypt:encryptor:password: your_passwordalgorithm: PBEWithMD5AndTripleDES
- 补充建议:
- 检查 Jasypt 版本是否兼容 Spring Boot 3.5(推荐升级至 3.0.4+)
- 避免使用不安全的算法(如
PBEWithMD5AndDES
)
- 在启动类添加注解:
问题二:Log4j 配置冲突
- 错误表现
- 启动时报
No configuration file found
或依赖冲突
- 启动时报
- 解决方案
- 排除冲突依赖(通过
mvn dependency:tree
分析) - 显式指定 Log4j2 配置路径:
logging:config: classpath:env/dev/log4j2.xml
- 补充建议:
- Spring Boot 3.x 默认使用 Logback,若需保留 Log4j2,需显式添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
- Spring Boot 3.x 默认使用 Logback,若需保留 Log4j2,需显式添加依赖:
- 排除冲突依赖(通过
问题三:MyBatis 注入失败
- 错误表现
- DB和mybatis的问题,遇到xxx bean that could not be found(Dao或者Mapper),无法注入
- 解决方案
- 确保目标包能被扫描到:@MapperScan(“net.xxx.prov.xxx.dao.xxx”)
- 配置文件加上:
mybatis.mapper-locations=classpath:/mybatis/mapper/*.xml
mybatis.config-location=classpath:/mybatis/mybatis-config.xml
- 看看配置类是否有注入,没有配置类请加上:
MybatisConfig.class:
@Configuration
@MapperScan(basePackages = "net.xxxx.prov.xxx.dao.xxx", sqlSessionTemplateRef = "SqlSessionTemplate", sqlSessionFactoryRef = "SqlSessionFactory")
public class MybatisConfig {@Bean(name = "SqlSessionFactory")public SqlSessionFactory SqlSessionFactory(@Qualifier("DataSource") DataSource DataSource) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(myhkbnDataSource);sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("/mybatis/mybatis-config.xml"));sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("/mybatis/mapper/xxx/*.xml"));return sessionFactory.getObject();}@Bean(name = "SqlSessionTemplate")public SqlSessionTemplate SqlSessionTemplate(@Qualifier("SqlSessionFactory") SqlSessionFactory SqlSessionFactory){return new SqlSessionTemplate(SqlSessionFactory);}
}
- 如果绑定了配置文件前缀,需要添加配置类
@Configuration
public class DataSourceConfig {@Bean(name = "DataSource")@ConfigurationProperties(prefix = "spring.datasource.xxx") // 绑定配置文件中的前缀public DataSource DataSource() {return DataSourceBuilder.create().build();}
}
- 问题:jdbcUrl is required with driverClassName
解决:spring.datasource.xxx.url 改成:spring.datasource.xxx.jdbc-url
- 补充建议:
- 检查 MyBatis 版本是否兼容 Spring Boot 3.5(推荐升级至 3.5.10+)
- 使用
@ConfigurationProperties
绑定数据源时,确保前缀正确(如spring.datasource.xxx
)
问题四:Redis 连接失败
- 错误表现
- 报
RedisConnectionFailureException
或 SSL 配置异常,问题:RedisConnectionFailureException: Cannot get Jedis connection at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:932)
- 报
解决:检查配置文件,新版的配置前缀改名了,特别注意ssl的配置,多了个enabled,源码位置:org.springframework.boot.autoconfigure.data.redis.RedisProperties
- 解决方案
- 注意 Spring Boot 3.x 默认使用 Lettuce,而非 Jedis
- 更新 Redis 配置(
application.yml
):spring:data:redis:host: 127.0.0.1port: 6379timeout: 5000mslettuce:pool:max-active: 500max-idle: 250min-idle: 0max-wait: 5000msssl:enabled: true
- 补充建议:
- 若仍需使用 Jedis,需显式添加依赖并排除 Lettuce
- 测试 Redis 服务的 SSL 证书是否有效
四、JDK 1.8 升级至 17 的注意事项
- 语言特性变更
- 移除
javax.xml.bind
等模块(需手动添加依赖) - 使用
records
和sealed class
优化代码
- 移除
- JVM 参数调整
- 默认垃圾回收器改为 G1(无需额外配置)
- 检查
-XX:+UseParallelGC
等参数是否仍适用
- 第三方库兼容性
- 确保所有依赖支持 JDK 17(如 Jackson、Hibernate 等)