一、版本升級背景
-
升級動機
- 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 等)