本文记录的是本地Mac系统的升级过程及遇到的问题。
一、JDK17安装
1.1 安装 JDK 到系统中
之前我的本地安装的JDK1.8,需要先安装Jdk17,下载地址:
https://www.oracle.com/java/technologies/downloads/#jdk17-mac
下载完成后,直接下一步>下一步正常安装就行:
1.2 配置环境变量
MacOS 环境配置的加载顺序为:
# 系统级别 /etc/profile /etc/paths # 用户级别 ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
前两个系统级别, 后面几个都是用户级别的。系统级别是在系统启动的时候就会加载。用户级别的是优先级高的存在就不在找下一个配置。~/.bashrc 是bash shell打开时候加载,这里使用 /ect/profile 配置环境变量。首先获得 Java 的安装目录。
/usr/libexec/java_home
打开环境变量, 设置 Java 环境变量。
vi ~/.bash_profile
增加配置
export JAVA_17_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
export PATH=$PATH:$JAVA_17_HOME/bin
export CLASSPATH=.:$JAVA_17_HOME/lib/dt.jar:$JAVA_17_HOME/lib/tools.jar
使用 wq! 保存配置,保存之后, 使用 source ~/.bash_profile 配置立即生效。
添加之后, 保存。 重新打开新的命令行工具。 使用 java -version 如果显示版本号, 就说明安装成功并可以使用了。
二、版本升级
修改jdk配置到17
<java.version>17</java.version>
修改springboot 到3.0.4版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.4</version>
<relativePath/>
</parent>
修改本地idea JDK切换到17
新增17版本的jdk,点击应用
这里我们基础的jdk17与springboot3.0.4升级就配置完成了,然后我们会发现因为升级后带来了很多的兼容问题,下面我整理了几个我在对程序员盒子项目做升级时候遇到的几个我认为有共同性的问题以及解法。
三、升级过过程中遇到的几个共通的问题及解法
3.1原Springboot2.x内集成的部分依赖包在3.x中不存在,需要制定版本号,自行下载
原来springboot 2.x下的mysql依赖配置方式(使用对应springboot版本默认集成的mysql依赖):
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
在编辑的时候/重新加载依赖包的时候,报错信息:For artifact {mysql:mysql-connector-java:null:jar}: The version cannot be empty.
根据错误提示,原本springboot2.x下已经集成了相应版本的mysql依赖,升级后mysql依赖已经不存在了,需要我们来指定版本,重新download
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
如果你遇到类似的问题{xxx:null:jar}: The version cannot be empty. 基本都是版本不存在需要显式的去指定。具体版本可以来这里查找:
https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient
3.2程序包javax.*好多包在jdk17中找不到了
例如这样:
原因:JDK17移除了 Javax 的模块,需要手动引入
https://baijiahao.baidu.com/s?id=1758965939027753195&wfr=spider&for=pc
jakarta这个就是原来的javax,Spring Boot3.0已经为所有依赖项从 Java EE 迁移到 Jakarta EE API,导致 servlet 包名的修改,Spring团队这样做的原因,主要是避免 Oracle 的版权问题
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.1.0</version>
</dependency>
3.3原来继承HandlerInterceptorAdapter类没有了,需要换成实现HandlerInterceptor
修改后
3.4 升级后使用JPA的项目会遇到这样的一个报错
原因还是3.2的问题,需要重新引包,有javax切换到jakarta
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
3.5 升级后使用JPA的项目会遇到这样的一个报错
org.hibernate.validator下包找不到
引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
3.6 BASE64Encoder不支持
new BASE64Encoder().encode(buffer);
改为:
Base64.getEncoder().encodeToString(buffer);
3.7 在启动的时候可能遇到循环以来之前没有检测出来的情况
(1)解决循环以来即可!
(2)或者增加配置,允许循环依赖:
在application.yml 中使用以下配置,好像是SpringBoot2.6.0之后默认禁止的:
spring:
main:
allow-circular-references: true #允许循环引用
四、重启服务,对现有的所有功能回归验证
启动服务:
做全面功能回归验证。