JDK 8 升级 17 及 springboot 2.x 升级 3.x 指南
JDK 8 升级 17
简介
从 JDK 8 升级到 JDK 17 的过程中,有几个主要的变化,特别是 Java Platform Module System (JPMS) 的引入,以及一些包路径的调整。以下是与 JDK 17 相关的一些重要变化:
-
Java Platform Module System (JPMS)
- 模块化:JDK 9 引入了模块系统,将标准 Java 库划分为多个模块。这影响了 JDK 17 中的包结构和类的组织方式。
- 模块路径:JDK 11 引入了
--module-path
和--add-modules
选项,允许用户指定模块路径和加载特定模块。
-
Java EE APIs 移除
- JAX-RS:
javax.ws.rs.*
包现在不在标准 Java SE 平台上。 - JAX-WS:
javax.xml.ws.*
包现在不在标准 Java SE 平台上。 - JAX-B:
javax.xml.bind.*
包现在不在标准 Java SE 平台上。
- JAX-RS:
-
其他变化
-
JavaFX:JavaFX 已经从标准 Java SE 平台中移除,现在作为一个独立的模块存在。
如果应用使用了 JavaFX,确保已经添加了 JavaFX 模块到应用中
-
JSR 355:JSR 355 定义了一些与 JavaFX 相关的包,这些包也不再包含在标准 Java SE 平台上。
-
-
JDK 17 中的新特性
- JEP 391: Foreign Function & Memory API (Incubator):提供了与外部代码和内存交互的能力。
- JEP 403: Sealed Classes:允许类声明为密封,以限制继承。
- JEP 404: Pattern Matching for switch (Preview):引入了模式匹配支持到
switch
语句中。 - JEP 414: Vector API (Fourth Incubator):提供了一种利用向量硬件指令的途径。
javax.* 包移到 jakarta.*
-
Jakarta EE 技术栈:随着 Java EE 转变为 Jakarta EE,许多
javax.*
包已经被迁移到jakarta.*
包下。这对于使用 Java Persistence API (JPA)、JSF、EJB 等技术的应用尤为重要。- javax.persistence.* -> jakarta.persistence.*
- javax.faces.* -> jakarta.faces.*
- javax.ejb.* -> jakarta.ejb.*
- javax.servlet.* -> jakarta.servlet.*
- javax.servlet.jsp.* -> jakarta.servlet.jsp.*
- javax.websocket.* -> jakarta.websocket.*
- javax.naming.* -> jakarta.naming.*
- javax.sql.* -> jakarta.sql.*
- javax.transaction.* -> jakarta.transaction.*
JDK 8 升级到 JDK 17 需确保代码中引用了正确的包名。应该使用
jakarta.*
而不是javax.*
。
maven pom 中更新 java 版本
-
建议在父项目添加全局变量 java.version,然后在 maven-compiler-plugin 引用
<properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.10.1</version><configuration><source>${java.version}</source><target>${java.version}</target><encoding>UTF-8</encoding></configuration></plugin></plugins> </build>
springboot 2.x 升级 3.x
spring-boot 与 cloud、alibaba-cloud 的版本对应
-
spring-cloud 与 spring-boot 的版本对应详见 spring-cloud 官方文档
-
spring-alibaba-cloud 与 spring-cloud、spring-boot 的版本对应详见 spring-alibaba-cloud 官方文档
redis 默认配置调整
在 Springboot 2.x 的版本中,redis 的默认配置是 spring.redis.*
,升级成 Springboot 3.x 以后,redis 的默认配置调整为了spring.data.redis.*
。
若继续使用 Springboot2.x 的 redis 配置,会导致获取不到 redis 的配置。
SpringBoot 3.x 整合 Querydsl
主要问题:springboot 升级 3.0,jpa 包路径从 javax
改成 jakarta
,在默认情况下,无法生存 Q 类,也没办法使用JPAQuery
解决方法:
-
引入依赖。重点:classifier 标签
<dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId><classifier>jakarta</classifier><version>5.0.0</version> </dependency><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><version>5.0.0</version><scope>provided</scope><optional>true</optional><classifier>jakarta</classifier> </dependency>
-
引入 maven plugin
<plugin><groupId>com.mysema.maven</groupId><artifactId>apt-maven-plugin</artifactId><version>1.1.3</version><executions><execution><!--<goals>--><!-- <goal>process</goal>--><!--</goals>--><configuration><outputDirectory>target/generated-sources</outputDirectory><processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor></configuration></execution></executions> </plugin>
注意:每个项目配置可能会有差别,在编译时可能会报错:
Attempt to recreate a file for type xxx
,导致此错误的情况也不太一致。可能的原因之一是因为配置了 goals,所以此处注释掉 goals,其他情况不一定能适用此方式。
其他注意事项
-
依赖循环引用 报错
如果升级前的 Spring Boot 版本早于 2.6.0,且存在 spring ioc 对象的循环引用,则需要添加允许循环引用的配置,否则报错
spring:main:allow-circular-references: true
-
WebMvcConfigurerAdapter.class 找不到报错
Spring Boot 3 基于 Spring Framework 6,而在 Spring Framework 5.3 中,
WebMvcConfigurerAdapter
类已经被弃用,并在后续版本中移除。解决方案
-
使用 WebMvcConfigurer 接口:
WebMvcConfigurerAdapter
是一个抽象适配器类,用于实现WebMvcConfigurer
接口。在 Spring Framework 6 中,可以直接实现
WebMvcConfigurer
接口来定制 Web MVC 的行为。 -
创建自定义配置类:
创建一个新的类,实现
WebMvcConfigurer
接口,并重写需要的方法。@Configuration public class WebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 自定义资源处理}@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {// 自定义路径匹配}// 其他需要的方法 }
-
-
Spring Boot 3.x 支持优雅退出,添加以下配置开启
# 打开优雅退出 server:shutdown: graceful # 多长时间后强制杀掉进程 spring:lifecycle:timeout-per-shutdown-phase: 30s
maven 及 maven 插件的版本升级
maven 版本升级
为了确保 Maven 版本与 Java 17 兼容,应该使用一个较新的 Maven 版本。Java 17 是一个长期支持 (LTS) 版本,它是在 2021 年 9 月发布的。因此,应该使用 Maven 3.6.0 或更高版本来确保良好的兼容性。
以下是几个推荐的 Maven 版本及其发布日期:
- Maven 3.6.0 - 发布于 2019 年 2 月 10 日
- Maven 3.6.3 - 发布于 2020 年 3 月 10 日
- Maven 3.8.1 - 发布于 2021 年 2 月 18 日
- Maven 3.8.5 - 发布于 2022 年 5 月 23 日
Maven 3.8.5 是一个较为推荐的版本,因为它包含了对 Java 17 的良好支持以及一些重要的安全修复和改进。
升级 Maven 版本
-
查看当前 Maven 版本:
打开终端或命令提示符,运行以下命令来查看已安装的 Maven 版本:
mvn --version
如果还没有安装 Maven,或者安装的版本较旧,可以按照下面的步骤安装或升级。
-
安装或升级 Maven:
-
Windows 用户:
- 访问 Apache Maven 官方下载页面 下载最新的 Maven 版本。
- 解压下载的文件到一个目录,例如
C:\apache-maven-3.8.5
。 - 将 Maven 的
bin
目录添加到系统环境变量PATH
中。 - 设置
M2_HOME
环境变量,值为 Maven 的安装目录。
-
Linux/macOS 用户:
-
使用包管理器安装 Maven,例如对于 Ubuntu/Debian 使用
apt-get
,对于 macOS 使用brew
:sudo apt update && sudo apt install maven
或者使用 Homebrew:
brew install maven
-
或者从 Apache Maven 官网下载二进制分发包,解压缩到
/usr/local
或其他位置,并通过mvn --version
确认安装成功。
-
-
-
设置 Java 17 作为默认 JDK:
- Windows 用户:
- 确保安装了 Java 17,并将其路径添加到环境变量
JAVA_HOME
中。 - 设置
JAVA_HOME
环境变量指向 Java 17 的安装目录。
- 确保安装了 Java 17,并将其路径添加到环境变量
- Linux/macOS 用户:
- 安装 Java 17,例如使用
sdkman
或者直接从 Oracle 或 Adoptium 下载。 - 设置
JAVA_HOME
环境变量指向 Java 17 的安装目录。 - 确保
JAVA_HOME
和PATH
环境变量被正确设置。
- 安装 Java 17,例如使用
- Windows 用户:
-
验证 Maven 和 Java 版本:
再次运行
mvn --version
命令,确保显示的 Java 版本为 17,并且 Maven 版本为 3.8.5 或更高。 -
配置 Maven 以使用 Java 17:
在
pom.xml
文件中指定 Java 17 编译和源代码版本,详见 maven-compiler-plugin 版本升级
maven-compiler-plugin 版本升级
-
为了确保 Maven 编译插件 (
maven-compiler-plugin
) 与 Java 17 兼容并支持 Spring Boot 3 的需求,需要选择一个合适的maven-compiler-plugin
版本。截至2023年,
maven-compiler-plugin
的最新稳定版本是 3.10.1。该版本与 Java 17 兼容,并且适用于 Spring Boot 3。 -
下面是
maven-compiler-plugin
的一个示例配置,用于确保使用 Java 17 进行编译:<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.10.1</version><configuration><source>17</source><target>17</target></configuration></plugin></plugins> </build>
这里的关键配置点包括:
<source>
和<target>
都设置为17
,以指示使用 Java 17 进行编译。<version>
设置为3.10.1
,这是与 Java 17 兼容的一个版本。
**请注意,需要根据实际的 Maven 和 Spring Boot 版本进行适当的调整。**如果需要使用特定版本的
maven-compiler-plugin
,请查阅官方文档或发布页面以确认版本的兼容性。`
相关文章:

JDK 8 升级 17 及 springboot 2.x 升级 3.x 指南
JDK 8 升级 17 简介 从 JDK 8 升级到 JDK 17 的过程中,有几个主要的变化,特别是 Java Platform Module System (JPMS) 的引入,以及一些包路径的调整。以下是与 JDK 17 相关的一些重要变化: Java Platform Module System (JPMS) …...

基于java的人居环境整治管理系统(源码+lw+部署文档+讲解等)
前言 💗博主介绍:✌全网粉丝20W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
深入了解Pip:Python包管理器的详细指南
目录 Pip简介Pip的安装与升级Pip的基本使用 安装包卸载包列出已安装的包查看包的信息 管理依赖 使用requirements.txt冻结当前环境的包 Pip进阶用法 安装特定版本的包使用代理安装包从本地文件安装包 创建和发布Python包 创建一个Python包编写setup.py文件发布到PyPI 常见问题…...

Corsearch 用 ClickHouse 替换 MySQL 进行内容和品牌保护
本文字数:3357;估计阅读时间:9 分钟 作者:ClickHouse Team 本文在公众号【ClickHouseInc】首发 Chase Richards 自 2011 年在初创公司 Marketly 担任工程负责人,直到 2020 年公司被收购。他现在是品牌保护公司 Corsear…...

常见的应急救援设备有哪些_鼎跃安全
在我们的生活中,应急事件的发生常常是突如其来的,它们对人民的生命财产安全构成重大威胁,同时也对社会稳定提出严峻挑战。在这样的紧急情况下,迅速开展有效的救援工作显得尤为重要。而在整个救援过程中,应急设备的使用…...
Vue 项目部署后首页白屏问题排查与解决
引言 在部署 Vue.js 项目时,有时会遇到首页加载后出现白屏的情况,这可能是由于多种原因造成的。本文将介绍一些常见的排查方法和解决方案,帮助开发者快速定位问题并解决。 1. 常见原因分析 首页白屏的问题可能由以下几个方面的原因导致&am…...

STM32 定时器移相任意角度和占空比,频率可调
由于使用了中断修改翻转的CCR值,对于频率超250K以上不太适用. void Motor1_Init(Motor MotorChValue) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;NVIC_InitTypeDef NVIC_Ini…...

C++ 与其他编程语言区别_C++11/14/17新特性总结
C11 decltype类型推导 decltype不依赖于初始化,根据表达式类推导类型 auto b :根据右边a的初始值来推导出变量的类型,然后将该初始值赋给bdecltype 则是根据a表达式来推导类型,变量的初始值与表达式的值无关表达式类型注意点&…...

玩转云服务:Google Cloud谷歌云永久免费云服务器「白嫖」 指南
前几天,和大家分享了: 玩转云服务:Oracle Cloud甲骨文永久免费云服务器注册及配置指南 相信很多同学都卡在了这一步: 可用性域 AD-1 中配置 VM.Standard.E2.1.Micro 的容量不足。请在其他可用性域中创建实例,或稍后…...

用18讲必看:宇哥亲划重点内容+核心题总结
25考研结束之后,张宇老师的风评可能会两极分化 其中一波把张宇老师奉为考研数学之神,吹捧「三向解题法」天下无敌。 另外一波对张宇老师的评价负面,在网上黑张宇老师! 为什么会这么说,因为张宇老师的新版36讲争议太…...

什么是安全生产痕迹化管理?如何做到生产过程中全程痕迹化管理?
安全生产痕迹化管理,简单来说,就是通过记录一些“信息”来确保安全工作的进展。这些方法包括记会议内容、写安全日记、拍照片、签字盖章、指纹识别、面部识别还有手机定位等。记录下来的文字、图片、数据和视频,就像一个个“脚印”࿰…...

VIsual Studio:为同一解决方案下多个项目分别指定不同的编译器
一、引言 如上图,我有一个解决方案【EtchDevice】,他包含两个(甚至更多个)子项目,分别是【DeviceRT】和【DeviceWin】,见名知意,我需要一个项目编译运行在RTOS上,譬如一个名叫INTime…...

Flat Ads资讯:Meta、Google、TikTok 7月产品政策速递
Flat Ads拥有全球媒介采买(MediaBuy)业务,为方便广告主及时了解大媒体最新政策,Flat Ads将整理大媒体产品更新月报,欢迎大家关注我们及时了解最新行业动向。 一、Meta 1、Reels 应用推广现可突出显示应用评分、点评和下载量 为了不断优化 Instagram 上的广告体验和广告表现,…...

嵌入式C++、ROS 、OpenCV、SLAM 算法和路径规划算法:自主导航的移动机器人流程设计(代码示例)
在当今科技迅速发展的背景下,嵌入式自主移动机器人以其广泛的应用前景和技术挑战吸引了越来越多的研究者和开发者。本文将详细介绍一个嵌入式自主移动机器人项目,涵盖其硬件与软件系统设计、代码实现及项目总结,并提供相关参考文献。 项目概…...
数据安全堡垒:SQL Server数据库备份验证与测试恢复全攻略
数据安全堡垒:SQL Server数据库备份验证与测试恢复全攻略 在数据库管理中,备份是确保数据安全的关键环节,但仅仅拥有备份是不够的,验证备份的有效性并能够从备份中成功恢复数据同样重要。SQL Server提供了一系列的工具和方法来执…...

嵌入式人工智能(40-基于树莓派4B的水滴传感器和火焰传感器)
虽然这两个传感器水火不容,我还是把他们放到一起了。本文是有线传感器的最后一个部分了。后面如果还有文章介绍有线传感器,也是补充学习其他内容不得已而为之。如果不是,就当我没说,哈哈。 1、水滴传感器 水滴传感器又称雨滴传感…...
EF访问PostgreSql,如何判断jsonb类型的数组是否包含某个数值
下面代码判断OpenUserIds(long[]类型的jsonb)字段,是否包含 8 basequery basequery.Where(m > Microsoft.EntityFrameworkCore.NpgsqlJsonDbFunctionsExtensions.JsonContains(EF.Functions, m.OpenUserIds, new long[] { 8 }));...
Qt 实战(8)控件 | 8.1、QComboBox
文章目录 一、QComboBox1、简介2、功能特性2.1、添加和移除项目2.2、设置和获取当前选中项2.3、模型/视图架构2.4、信号与槽 3、总结 前言: QComboBox 是 Qt 框架中一个非常实用的控件,它允许用户从一个下拉列表中选择一个项目。这个控件广泛应用于需要用…...
模拟算法概览
前言 LeetCode上的模拟算法题目主要考察通过直接模拟问题的实际操作和过程来解决问题。这类题目通常不需要高级的数据结构或复杂的算法,而是通过仔细的逻辑和清晰的步骤逐步解决。 适合解决的问题 模拟算法适合用来解决那些逻辑明确、步骤清晰且可以逐步执行的问…...

uniapp手写滚动选择器
文章目录 效果展示HTML/Template部分:JavaScript部分:CSS部分:完整代码 没有符合项目要求的选择器 就手写了一个 效果展示 实现一个时间选择器的功能,可以选择小时和分钟: HTML/Template部分: <picker…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...