我把springboot项目从Java 8 升级 到了Java 17 的过程总结,愿为君提前踩坑!

news2024/11/30 11:32:27

项目从jdk8升级到jdk17,我不是为了追求java 17的新特性(准确来说也还没有去了解有什么新特性),也不是为了准确与时俱进,永远走在java行列的最前端,纯粹因为项目需要,因为我们都知道,只要项目能跑,你就不要动它!

目录

  • 背景
  • 目标
  • 环境安装
    • Java 17
      • 下载
        • 方式一
        • 方式二
      • 配置环境变量与java8共存
    • SpringBoot3.0.0
    • Maven 3.6.3+
    • Idea 2022.2.1+
      • 下载
      • 安装
  • 配置IDEA和项目 java17环境
    • IDEA中Maven设置
    • IDEA环境配置
      • Setting设置
      • Project Structure设置
  • 问题处理
    • 运行项目出现 无效的源发行版: 17
    • hibernate unknown
    • ERROR StatusLogger Unable to create Lookup for ctx
    • java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present
    • swagger替换为openapi后,会有报错
    • flyway问题
    • 动态数据源问题
  • 最后

背景

Java 程序员应该都熟悉下面这句话: 版本任他发,我用 Java 8 。自从 2014 年 3 月 Java SE 8.0(1.8.0)发布,到现在已经是第九年,21 年 9 月 Java SE 17(LTS)也已经发布,但绝大部分 Java 开发人员依然使用 1.8 版本。懒惰是其中的一方面原因,生产环境稳定大于一切的压力之下,既然 Java8 已经表现很好没有什么问题,那么也就没有必要冒险去做版本升级了,毕竟“升级”在很多情况下都意味着工作量和风险。

不过在今年之后,这个情况发生了变化。由于厂商纷纷宣布即将停止 1.8 版本的更新维护:Oracle 于 2019 年 1 月停止商用用途中的更新,2020 年 12 月停止非商用版本更新;AdoptOpenJDK 于 2023 年 9 月或之前停止更新;Amazon Corretto 于 2023 年 6 月或之前停止更新。意味着 23 年 9 月之后,将不再有厂商继续更新 Java 8。

2014年发布的java SE 8和2017年发布的java EE 8,至今还是使用最广泛的java版本,大部分java开发者对于java 8之后的升级总是敬而远之,这跟java 9以后的破坏性升级和oracle的商用协议有关,但随着9月java 17的发布,我们有更多理由去升级和在新项目中使用更新的java了。


目标

本次操作是mac版本下的

  • Java 8 应用升级到 Java 17
  • SpringBoot 版本升级到 SpringBoot3.0.0
  • 推荐的 Java 17 开发环境包括:Maven 3.6.3+、Idea 2022.2.1+

环境安装

Java 17

下载

方式一

下载链接🔗:JDK开发工具包17.0.9下载

在这里插入图片描述
要选择对应的版本去下载,比如我mac,在左上角的苹果标志,直接点击,弹出菜单,点击“关于本机”,确认一下本机电脑的CPU是Intel还是ARM。

  1. 如果是Intel,点击“x64 DMG Installer”的右边网址
  2. 或者选择 macOS 下的 ARM64 DMG(适用于苹果芯片,如 M1、M2 等)

在这里插入图片描述
我的是M2,所以如上图

按照步骤直接默认选项安装即可。

方式二

在 mac 下,也可以使用 sdkman 来安装 jdk 和 maven:
(其实我一开始是使用的此方法,但是由于那会网络一直不稳定,最后还是使用的方法一)

命令行执行下面操作即可(sdk 相关命令可以使用 sdk help 查看)

curl -s "https://get.sdkman.io" | bash

sdk install java 22.3.r17-grl
sdk install maven 3.8.2

下载中截图
在这里插入图片描述

由于我网络不稳定,出现如下报错:

Installing script cli archive...
* Downloading...
curl: (28) Failed to connect to github.com port 443 after 75015 ms: Couldn't connect to server

'curl --fail --location --progress-bar "${SDKMAN_SERVICE}/broker/download/sdkman/install/${SDKMAN_VERSION}/${SDKMAN_PLATFORM}" > "$sdkman_zip_file"': command failed with exit code 28.

然后我就再次执行命令

curl -s "https://get.sdkman.io" | bash

结果提示已经存在,可以强制更新
在这里插入图片描述

算了,我还是卸载重新安装吧:

rm -rf "$HOME/.sdkman"

再次执行上面的安装命令
继续有报错出来

touch: /Users/myName/.bash_profile: Permission denied
'touch "$sdkman_bash_profile"': command failed with exit code 1.

可以看到上面报错是要修改.bash_profile文件,我们可以自己修改

vim ~/.bash_profile

.bash_profile文件最后一行加上下面内容

export SDKMAN_CANDIDATES_API=https://api.sdkman.io/2
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

然后执行

source ~/.bash_profile

下载jdk17

sdk install java 22.3.r17-grl

下载中
在这里插入图片描述
我到这里又出现了下载超时的问题了,心里一万只🦙🦙🦙跑过啊,于是我果断去用了方式一


配置环境变量与java8共存

由于之前也是一直使用java8,所以下载安装完java17后,可以看下java版本是否有变
在这里插入图片描述

还是java8,因为我们的环境还是没有变,我的是.bash_profile文件
在这里插入图片描述

先看看下载的jdk17在不在默认下载的目录/Library/Java/JavaVirtualMachines

在这里插入图片描述
接下来就是更换环境变量,使用jdk17了,如下

vim ~/.bash_profile

增加如下内容

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
#export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.

在这里插入图片描述
然后执行保存,再查看版本

source ~/.bash_profile
java -version

可以发现已经是java17了
在这里插入图片描述

不同Java版本间的切换
若要将Java17切换到Java其他版本,只需要将.bash_profile文件中的JAVA_HOME改成Java其他版本的目录即可,修改的过程和之前配置JAVA_HOME环境变量类似。


SpringBoot3.0.0

查看springBoot版本

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.5</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

这里只要更换版本即可

<version>3.0.0</version>

然后reload maven,一定会有报错,这个我在下面也会有提到


Maven 3.6.3+

这里需要注意下载的版本是否是你的IDEA版本支持的Maven版本
Maven官网
在这里插入图片描述
点击 Download 拉到最底下,下载历史版本
在这里插入图片描述
下载解压更新系统变量就不说了


Idea 2022.2.1+

下载

因为社区版免费使用,所以下载社区版安装就好。下载的版本是Idea 2022.2.1+就可以,不做过多阐述。

下载地址:https://www.jetbrains.com/idea/download/#section=mac

安装

mac 下,ideaIC-2023.1.2-aarch64.dmg 直接双击安装,按照说明完成操作即可。接下来就是启动。

配置IDEA和项目 java17环境

IDEA中Maven设置

进入Idea File->settings…->Build,Execution,Deployment->Build Tools->Maven
在这里插入图片描述
还需要配置另两个地方:Runner和Importing内选择Java17
在这里插入图片描述
在这里插入图片描述

IDEA环境配置

Setting设置

在这里插入图片描述

Project Structure设置

File - Project Structure…

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⚠️如果编译项目出现 java: 无效的源发行版: 17,则需要设置:
在这里插入图片描述

全部配置完毕,就可以启动项目了,这就会遇到下面一堆的问题了,但是不要慌,我们一个个解决


问题处理

从这里开始,就是本篇的重点了,一个接一个地处理问题。

运行项目出现 无效的源发行版: 17

这个可能性是有两种

  1. 环境变量配置后没有成功保存

    • 打开shell,执行java -version命令,如果出现的是jdk17,则说明环境变量正确,反之再去修改环境变量
  2. idea在更换jdk后没有重启

如果没问题,查看项目目录 External Libraries 外部库中,使用的应该就是Java17,如下
在这里插入图片描述

hibernate unknown

maven中Dependencies引入的hibernate报错
在这里插入图片描述

其实就是版本兼容的问题
需要删除原来的依赖,然后升级版本:6.1.7.Final

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.1.7.Final</version>
        </dependency>

依赖默认情况下都在如下路径,后面的删除依赖也是同样的
在这里插入图片描述

ERROR StatusLogger Unable to create Lookup for ctx

启动报错
在这里插入图片描述

ERROR StatusLogger Unable to create Lookup for ctx
 java.lang.NoClassDefFoundError: org/apache/logging/log4j/util/ServiceLoaderUtil
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.util.ServiceLoaderUtil
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)

这个可以看官方发行版本:log4j版本:2.22.0
其实也是版本兼容的问题,需要删除原来的依赖,然后升级版本:2.22.0


			<dependency>
				<groupId>org.apache.mvnging.log4j</groupId>
				<artifactId>log4j-core</artifactId>
				<version>2.22.0</version>
			</dependency>

			<dependency>
				<groupId>org.apache.logging.log4j</groupId>
				<artifactId>log4j-slf4j-impl</artifactId>
				<version>2.22.0</version>
			</dependency>

			<dependency>
				<groupId>org.apache.logging.log4j</groupId>
				<artifactId>log4j-jul</artifactId>
				<version>2.22.0</version>
			</dependency>

			<dependency>
				<groupId>org.apache.logging.log4j</groupId>
				<artifactId>log4j-api</artifactId>
				<version>2.22.0</version>
			</dependency>

java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present

启动报错

java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present
Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest

这个问题让我找了好半天的解决办法
参考链接:

  1. Springfox Type javax.servlet.http.HttpServletRequest not present
  2. Spring Boot3.0(六):整合swagger
  3. Type javax.servlet.http.HttpServletRequest not present #4061

原因是:SpringFox 和 Spring Boot 3 的组合将无法工作。这里就需要替换了

解决:
需要删除原来的依赖

  • 删除SpringFox的引用并且对于spring-boot和swagger-ui之间的集成
			<dependency>
				<groupId>io.springfox</groupId>
				<artifactId>springfox-boot-starter</artifactId>
				<version>${springfox.version}</version>
			</dependency>
  • 将库添加到项目依赖项列表中(无需额外配置):
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.2.0</version>
</dependency>

swagger替换为openapi后,会有报错

这里替换为如下类即可
在这里插入图片描述
在这里插入图片描述
更多内容可以查看springfox迁移指南

flyway问题

org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration and org.flywaydb.core.api.configuration.FluentConfiguration
在这里插入图片描述

***************************APPLICATION FAILED TO START***************************Description:An attempt was made to call a method that does not exist. The attempt was made from the following location:

org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration.configureProperties(FlywayAutoConfiguration.java:234)The following method did not exist:    'org.flywaydb.core.api.configuration.FluentConfiguration org.flywaydb.core.api.configuration.FluentConfiguration.oracleSqlplus(boolean)'The calling method's class, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration, was loaded from the following location:

Action:Correct the classpath of your application so that it contains compatible versions of the classes org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration and org.flywaydb.core.api.configuration.FluentConfiguration

解决
升级版本:

			<dependency>
				<groupId>org.flywaydb</groupId>
				<artifactId>flyway-core</artifactId>
				<version>7.14.0</version>
			</dependency>

并且:将属性设置为spring.flyway.enabled来禁用 Flyway 的自动配置

参考链接🔗:Spring-boot 3.0不支持flyway 7.15

动态数据源问题

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.axiomesh.bt.common.BTInitializer required a bean of type 'com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator' that could not be found.


Action:

Consider defining a bean of type 'com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator' in your configuration.

解决

  • 升版本
  • 改配置(dynamic-datasource-spring-boot-starter—》dynamic-datasource-spring-boot3-starter)
  • 删除依赖,重新下载
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
	<version>4.2.0</version>
</dependency>

在这里插入图片描述

然后再次启动项目,如果你还有别的问题,那就一一解决,大部分都是版本兼容问题、旧的依赖未清除问题,加油!


最后

  • 好看的灵魂千篇一律,有趣的鲲志一百六七!
  • 如果觉得文章还不错的话,可以点赞+收藏+关注 支持一下,鲲志的主页 还有很多有趣的文章,欢迎小伙伴们前去点评
  • 如果有什么需要改进的地方还请大佬指出❌

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1290639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日志框架梳理(Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2)

原文链接 日志框架发展历程 在了解日志框架时总会列出一系列框架&#xff1a;Log4j&#xff0c;Reload4j&#xff0c;JUL&#xff0c;JCL&#xff0c;SLF4J&#xff0c;Logback&#xff0c;Log4j2&#xff0c;这么多框架让人感到混乱&#xff0c;该怎么选取、该怎么用。接下来…

LV.12 D23 IIC控制器与MPU6050 学习笔记

一、Exynos_4412下的IIC控制器 ​ 4412有四个IIC&#xff0c;如果要使用需要配置四个寄存器 I2CCON&#xff1a;配置一些功能 I2CSTAT&#xff1a;控制一些功能、显示一些状态 I2CDS&#xff1a;发送和接收数据 I2CADD&#xff1a;当4412作为从机时需要一个地址&#xff…

亚马逊云科技Serverless视频内容摘要提取方案

概述 随着GenAI的普及&#xff0c;视频内容摘要生成成为一个备受关注的领域。通过将视频内容转化为文本&#xff0c;可以探索到更广泛的应用场景&#xff0c;其中包括&#xff1a; 视频搜索与索引&#xff1a;将视频内容转化为文本形式&#xff0c;可以方便地进行搜索和索引操作…

利用阿里云 DDoS、WAF、CDN 和云防火墙为在线业务赋能

在这篇博客中&#xff0c;我们将详细讨论使用阿里云 CDN 和安全产品保护您的在线业务所需的步骤。 方案描述 创新技术的快速发展为世界各地的在线业务带来了新的机遇。今天的人们不仅习惯了&#xff0c;而且依靠互联网来开展他们的日常生活&#xff0c;包括购物、玩游戏、看电…

HarmonyOS4.0从零开始的开发教程04 初识ArkTS开发语言(下)

HarmonyOS&#xff08;二&#xff09; 初识ArkTS开发语言&#xff08;下&#xff09;之TypeScript入门 声明式UI基本概念 应用界面是由一个个页面组成&#xff0c;ArkTS是由ArkUI框架提供&#xff0c;用于以声明式开发范式开发界面的语言。 声明式UI构建页面的过程&#xff…

打包 抖音直播云游戏

抖音直播云游戏 oaid资源中的bcpkix-jdk15to18-1.68.jar与抖音云游戏的资源冲突。 其实资源名称是一样的&#xff0c;拷贝时资源名称有变化。 为解决此问题&#xff0c;需要规范化文件的资源名称&#xff0c;将.置为_ Error: Command failed: cmd /c echo off && Chc…

Kubernetes(K8s)DashBoard的使用-11

DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实&#xff0c;为了提供更丰富的用户体验&#xff0c;kubernetes还开发了一个基于web的用户界面&#xff08;Dashboard&#xff09;。用户可以使用Dashboard部署容器化的应用&#xff0c;还可以…

Redis key过期删除机制实现分析

文章目录 前言Redis key过期淘汰机制惰性删除机制定时扫描删除机制 前言 当我们创建Redis key时&#xff0c;可以通过expire命令指定key的过期时间(TTL)&#xff0c;当超过指定的TTL时间后&#xff0c;key将会失效。 那么当key失效后&#xff0c;Redis会立刻将其删除么&#…

k8s 安装 Longhorn

Longhorn 的 helm 模板官网地址&#xff1a;Longhorn 加入仓库 helm repo add longhorn https://charts.longhorn.iohelm repo update开始部署 helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.5.3检查pod运行状态是…

STM32——电动车报警器

项目设计 // 如果检测到 PA4 被拉低&#xff08;小偷偷车&#xff09;&#xff0c;并且警报模式打开 // 则将 PB7 拉低&#xff0c;继电器通电&#xff0c;喇叭一直响 // 如果检测到 PA5 被拉高&#xff08;按键 A 按下&#xff09;&#xff0c;设定为开启警报模式 // 则将…

0X05

打开题目 点击完登录和注册都没有什么反应&#xff0c;所以先扫一下看看 在出现admin.php后就截止了&#xff0c;访问看看,进入后台。。 尝试一下弱口令 admin/12345 或者是demo/demo 设计中-自定义->右上角导出主题 找到一个导出的点&#xff0c;下载了一个1.zip压缩包…

多传感器融合SLAM在自动驾驶方向的初步探索的记录

1. VIO的不可观问题 现有的VIO都是解决的六自由度的问题, 但是对于行驶在路面上的车来说, 通常情况下不会有roll与z方向的自由度, 而且车体模型限制了不可能有纯yaw的变换. 同时由于IMU在Z轴上与roll, pitch上激励不足, 会导致IMU在初始化过程中尺度不准以及重力方向估计错误,…

配置CentOS服务器以支持PHP

CentOS是一款优秀的开源服务器操作系统&#xff0c;为各种网络服务提供了强大的支持。为了使CentOS服务器能够支持PHP&#xff0c;我们需要进行一些必要的配置。下面将介绍配置CentOS服务器以支持PHP的关键步骤。 安装PHP 首先&#xff0c;需要安装PHP解释器。在CentOS上&…

设置webstorm和idea符合Alibaba规范

只格式化自己更改的代码 ctrlShiftAltL 插件建议 Alibaba Java Coding Guidelines&#xff08;新版本的idea不支持&#xff0c;有其他同名的非官方版可代替&#xff09;&#xff0c;使用方法在此不赘述 1、设置webstorm 包含 设置两个空格缩进&#xff0c;去掉行尾分号&#…

用Mnesia为cache增加分布式支持

一&#xff1a;分布式缓存 1.选取通信策略 在设计分布式程序时&#xff0c;可供选择的通信方式主要有两种&#xff1a;异步通信和同步通信。采用异步通信时&#xff0c;发送方无须等待任何确认或应答。而在采用同步通信时&#xff0c;发送方会处于挂起状态&#xff0c;直至收…

万宾科技智能水环境综合治理监测系统效果

水环境综合治理是一项旨在全面改善水环境质量的系统工程。它以水体为对象&#xff0c;综合考虑各种因素&#xff0c;通过科学规划和技术手段&#xff0c;解决水环境污染、生态退化等问题&#xff0c;核心理念是“统一规划、分步实施&#xff1b;标本兼治&#xff0c;重在治本&a…

用C语言实现链栈的基本操作

#include <stdio.h> #include <malloc.h> #define ElemType char//相当于ElemType等同于char类型 //链式结构 数据域指针域 typedef struct LinkStackNode//定义一个链栈的结构体类型 {ElemType data;//ElemType是链栈的元素类型&#xff0c;代表数据域struct Lin…

京东数据运营(京东API接口):10月投影仪店铺数据分析

鲸参谋监测的京东平台10月份投影仪市场销售数据已出炉&#xff01; 10月份&#xff0c;环同比来看&#xff0c;投影仪市场销售均上涨。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台投影仪的销量为16万&#xff0c;环比增长约22%&#xff0c;同比增长约8%&#xff1…

关于前端学习的思考-align-items的用法

垂直对齐只对&#xff0c;显示模式display&#xff1a;flex有效 所以只能是flex 盒子才能应用。 摆四张图片就能清晰认识&#xff0c;不再赘述。

2023 金砖国家职业技能大赛网络安全省赛二三阶段样题(金砖国家未来技能挑战赛)

2023 金砖国家职业技能大赛网络安全省赛二三阶段样题&#xff08;金砖国家未来技能挑战赛&#xff09; 第二阶段&#xff1a; 安全运营 **背景&#xff1a;**作为信息安全技术人员必须能够掌握操作系统加固与安全管控、防火 墙一般配置、常见服务配置等相关技能&#xff0c;利…