当前位置: 首页 > news >正文

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-RSjavax.ws.rs.* 包现在不在标准 Java SE 平台上。
    • JAX-WSjavax.xml.ws.* 包现在不在标准 Java SE 平台上。
    • JAX-Bjavax.xml.bind.* 包现在不在标准 Java SE 平台上。
  • 其他变化

    • 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

解决方法

  1. 引入依赖。重点: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>
    
  2. 引入 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 类已经被弃用,并在后续版本中移除。

    解决方案

    1. 使用 WebMvcConfigurer 接口

      WebMvcConfigurerAdapter 是一个抽象适配器类,用于实现 WebMvcConfigurer 接口。

      在 Spring Framework 6 中,可以直接实现 WebMvcConfigurer 接口来定制 Web MVC 的行为。

    2. 创建自定义配置类

      创建一个新的类,实现 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 版本

  1. 查看当前 Maven 版本:

    打开终端或命令提示符,运行以下命令来查看已安装的 Maven 版本:

    mvn --version
    

    如果还没有安装 Maven,或者安装的版本较旧,可以按照下面的步骤安装或升级。

  2. 安装或升级 Maven:

    • Windows 用户:

      1. 访问 Apache Maven 官方下载页面 下载最新的 Maven 版本。
      2. 解压下载的文件到一个目录,例如 C:\apache-maven-3.8.5
      3. 将 Maven 的 bin 目录添加到系统环境变量 PATH 中。
      4. 设置 M2_HOME 环境变量,值为 Maven 的安装目录。
    • Linux/macOS 用户:

      1. 使用包管理器安装 Maven,例如对于 Ubuntu/Debian 使用 apt-get,对于 macOS 使用 brew

        sudo apt update && sudo apt install maven
        

        或者使用 Homebrew:

        brew install maven
        
      2. 或者从 Apache Maven 官网下载二进制分发包,解压缩到 /usr/local 或其他位置,并通过 mvn --version 确认安装成功。

  3. 设置 Java 17 作为默认 JDK:

    • Windows 用户:
      1. 确保安装了 Java 17,并将其路径添加到环境变量 JAVA_HOME 中。
      2. 设置 JAVA_HOME 环境变量指向 Java 17 的安装目录。
    • Linux/macOS 用户:
      1. 安装 Java 17,例如使用 sdkman 或者直接从 Oracle 或 Adoptium 下载。
      2. 设置 JAVA_HOME 环境变量指向 Java 17 的安装目录。
      3. 确保 JAVA_HOMEPATH 环境变量被正确设置。
  4. 验证 Maven 和 Java 版本:

    再次运行 mvn --version 命令,确保显示的 Java 版本为 17,并且 Maven 版本为 3.8.5 或更高。

  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 的过程中&#xff0c;有几个主要的变化&#xff0c;特别是 Java Platform Module System (JPMS) 的引入&#xff0c;以及一些包路径的调整。以下是与 JDK 17 相关的一些重要变化&#xff1a; Java Platform Module System (JPMS) …...

基于java的人居环境整治管理系统(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝20W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…...

深入了解Pip:Python包管理器的详细指南

目录 Pip简介Pip的安装与升级Pip的基本使用 安装包卸载包列出已安装的包查看包的信息 管理依赖 使用requirements.txt冻结当前环境的包 Pip进阶用法 安装特定版本的包使用代理安装包从本地文件安装包 创建和发布Python包 创建一个Python包编写setup.py文件发布到PyPI 常见问题…...

Corsearch 用 ClickHouse 替换 MySQL 进行内容和品牌保护

本文字数&#xff1a;3357&#xff1b;估计阅读时间&#xff1a;9 分钟 作者&#xff1a;ClickHouse Team 本文在公众号【ClickHouseInc】首发 Chase Richards 自 2011 年在初创公司 Marketly 担任工程负责人&#xff0c;直到 2020 年公司被收购。他现在是品牌保护公司 Corsear…...

常见的应急救援设备有哪些_鼎跃安全

在我们的生活中&#xff0c;应急事件的发生常常是突如其来的&#xff0c;它们对人民的生命财产安全构成重大威胁&#xff0c;同时也对社会稳定提出严峻挑战。在这样的紧急情况下&#xff0c;迅速开展有效的救援工作显得尤为重要。而在整个救援过程中&#xff0c;应急设备的使用…...

Vue 项目部署后首页白屏问题排查与解决

引言 在部署 Vue.js 项目时&#xff0c;有时会遇到首页加载后出现白屏的情况&#xff0c;这可能是由于多种原因造成的。本文将介绍一些常见的排查方法和解决方案&#xff0c;帮助开发者快速定位问题并解决。 1. 常见原因分析 首页白屏的问题可能由以下几个方面的原因导致&am…...

STM32 定时器移相任意角度和占空比,频率可调

由于使用了中断修改翻转的CCR值&#xff0c;对于频率超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不依赖于初始化&#xff0c;根据表达式类推导类型 auto b &#xff1a;根据右边a的初始值来推导出变量的类型&#xff0c;然后将该初始值赋给bdecltype 则是根据a表达式来推导类型&#xff0c;变量的初始值与表达式的值无关表达式类型注意点&…...

玩转云服务:Google Cloud谷歌云永久免费云服务器「白嫖」 指南

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

用18讲必看:宇哥亲划重点内容+核心题总结

25考研结束之后&#xff0c;张宇老师的风评可能会两极分化 其中一波把张宇老师奉为考研数学之神&#xff0c;吹捧「三向解题法」天下无敌。 另外一波对张宇老师的评价负面&#xff0c;在网上黑张宇老师&#xff01; 为什么会这么说&#xff0c;因为张宇老师的新版36讲争议太…...

什么是安全生产痕迹化管理?如何做到生产过程中全程痕迹化管理?

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

VIsual Studio:为同一解决方案下多个项目分别指定不同的编译器

一、引言 如上图&#xff0c;我有一个解决方案【EtchDevice】&#xff0c;他包含两个&#xff08;甚至更多个&#xff09;子项目&#xff0c;分别是【DeviceRT】和【DeviceWin】&#xff0c;见名知意&#xff0c;我需要一个项目编译运行在RTOS上&#xff0c;譬如一个名叫INTime…...

Flat Ads资讯:Meta、Google、TikTok 7月产品政策速递

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

嵌入式C++、ROS 、OpenCV、SLAM 算法和路径规划算法:自主导航的移动机器人流程设计(代码示例)

在当今科技迅速发展的背景下&#xff0c;嵌入式自主移动机器人以其广泛的应用前景和技术挑战吸引了越来越多的研究者和开发者。本文将详细介绍一个嵌入式自主移动机器人项目&#xff0c;涵盖其硬件与软件系统设计、代码实现及项目总结&#xff0c;并提供相关参考文献。 项目概…...

数据安全堡垒:SQL Server数据库备份验证与测试恢复全攻略

数据安全堡垒&#xff1a;SQL Server数据库备份验证与测试恢复全攻略 在数据库管理中&#xff0c;备份是确保数据安全的关键环节&#xff0c;但仅仅拥有备份是不够的&#xff0c;验证备份的有效性并能够从备份中成功恢复数据同样重要。SQL Server提供了一系列的工具和方法来执…...

嵌入式人工智能(40-基于树莓派4B的水滴传感器和火焰传感器)

虽然这两个传感器水火不容&#xff0c;我还是把他们放到一起了。本文是有线传感器的最后一个部分了。后面如果还有文章介绍有线传感器&#xff0c;也是补充学习其他内容不得已而为之。如果不是&#xff0c;就当我没说&#xff0c;哈哈。 1、水滴传感器 水滴传感器又称雨滴传感…...

EF访问PostgreSql,如何判断jsonb类型的数组是否包含某个数值

下面代码判断OpenUserIds&#xff08;long[]类型的jsonb&#xff09;字段&#xff0c;是否包含 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、总结 前言&#xff1a; QComboBox 是 Qt 框架中一个非常实用的控件&#xff0c;它允许用户从一个下拉列表中选择一个项目。这个控件广泛应用于需要用…...

模拟算法概览

前言 LeetCode上的模拟算法题目主要考察通过直接模拟问题的实际操作和过程来解决问题。这类题目通常不需要高级的数据结构或复杂的算法&#xff0c;而是通过仔细的逻辑和清晰的步骤逐步解决。 适合解决的问题 模拟算法适合用来解决那些逻辑明确、步骤清晰且可以逐步执行的问…...

uniapp手写滚动选择器

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

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...

PLC入门【4】基本指令2(SET RST)

04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C)&#xff0c;从 文件 - 主画面&#xff0c;“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...

GB/T 43887-2024 核级柔性石墨板材检测

核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标&#xff1a; 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...

【Redis】Redis从入门到实战:全面指南

Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...

【Java基础】​​向上转型(Upcasting)和向下转型(Downcasting)

在面向对象编程中&#xff0c;转型&#xff08;Casting&#xff09; 是指改变对象的引用类型&#xff0c;主要涉及 继承关系 和 多态。 向上转型&#xff08;Upcasting&#xff09; ⬆️ 定义 将 子类对象 赋值给 父类引用&#xff08;自动完成&#xff0c;无需强制转换&…...

OCC笔记:TDF_Label中有多个相同类型属性

注&#xff1a;OCCT版本&#xff1a;7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...