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,请查阅官方文档或发布页面以确认版本的兼容性。`

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

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

相关文章

面试题:MySQL 索引

1. 谈一下你对于MySQL索引的理解?(为什么MySQL要选择B+树来存储索引) MySQL的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单来说就是可以保证在树的高度不变的情况下存储更多的数据: IO效率的提高:在MySQL数据库中,…

E19.【C语言】练习:数组

有序序列合并 描述 输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 数据范围&#xff1a; 1≤n,m≤1000 &#xff0c; 序列中的值满足 0≤val≤30000 输入描述&#xff1a; 输入包含三行&#xff0c; 第一行包含两个正整数n, m&#xff0c;用空…

大模型的经典面试问题及答案

大语言模型&#xff08;LLM&#xff09;在人工智能中变得越来越重要&#xff0c;在各个行业都有应用。随着对大语言模型专业人才需求的增长&#xff0c;本文提供了一套全面的面试问题和答案&#xff0c;涵盖了基本概念、先进技术和实际应用。如果你正在为面试做准备&#xff0c…

ABB机器人EGM功能简单应用

EGM中使用的是Protocol Buffer2的协议&#xff0c;从Egm.proto模板文件中可以了解到&#xff0c;协议版本没有定义默认为proto2&#xff0c;目前最新版本为proto3。PC安装了RobotStudio 6.08后&#xff0c;在如下路径可以找到egm.proto模板文件。 C:\ProgramData\ABB Industri…

ISP-LSC

1. 概述 Lens shading分为两个部分&#xff0c;亮度均匀性&#xff08;luma shading correction&#xff09;&#xff0c;色彩均匀性&#xff08;colour shading correction&#xff09;。 lens 的各位置和中心的透射率不同&#xff1a;luma shading lens 对不同光谱的shift 不…

NOILinux2.0安装

NOI官方已发布NOILinux2.0&#xff0c;可是如何安装使用呢&#xff1f;我来教你。 首先下载VMWare和NOILinux2.0的ios&#xff0c;当然你用什么虚拟机软件都可以。这里我用的是VMware。 NOIlinux2.0的下载链接&#xff1a; NOI Linux 2.0发布&#xff0c;将于9月1日起正式启用…

Cesium 体积云效果

Cesium 体积云效果&#xff08;局部&#xff09; 原理&#xff1a;RayMarching光线步进噪声&#xff0c;需要修改源码让cesium支持3D纹理&#xff08;texImage3D&#xff09; 源码修改思路&#xff1a;Cesium中使用Sampler3D&#xff0c;3D纹理&#xff0c;实现体渲染 感谢思…

Debian12 安装Docker 用 Docker Compose 部署WordPress

服务器准备&#xff1a; 以root账号登录&#xff0c;如果不是root&#xff0c;后面指令需要加sudo apt update apt install apt-transport-https ca-certificates curl gnupg lsb-release添加GPG密钥&#xff0c;推荐国内源 curl -fsSL https://mirrors.aliyun.com/docker…

【Sklearn-驯化】一文搞懂很难的条件随机场系列算法:hmm、crf以及实践

【Sklearn-驯化】一文搞懂很难的条件随机场系列算法&#xff1a;hmm、crf以及实践 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相…

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)

接上篇《60、Pandas中DataFrame对象的操作&#xff08;一&#xff09;》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…

C#与欧姆龙PLC 通信——fins udp协议

前言 欧姆龙PLC在工控领域占有很大的市场份额,在上位机编程领域,实现上位机和欧姆龙PLC的通信也是必备的技能,上位机和PLC可以通过fins udp和fins tcp协议通信,本文介绍的是fins udp协议,该协议具有传输速度快的特点,为了帮助大家学习fins udp协议,我编写了“欧姆龙Fin…

从零开始学习网络安全渗透测试之基础入门篇——(四)反弹SHELL不回显带外正反向连接防火墙出入站文件上传下载

一、反弹SHELL 反弹SHELL&#xff08;Reverse Shell&#xff09;是一种网络攻击技术&#xff0c;它允许攻击者在一个被入侵的计算机上执行命令&#xff0c;即使该计算机位于防火墙或NAT&#xff08;网络地址转换&#xff09;之后。通常&#xff0c;当攻击者无法直接连接到目标…

基于OPENMV实现一个单目测速测试

1、测试平台&#xff1a;OpenMV4H7Plus开发板​ 使用的相机是 MT9V034 相机对应为752x480黑白图像&#xff0c;为全局快门 2、测速的时候&#xff0c;仅选取最大物体的抓取&#xff0c;这里采用了几个步骤&#xff1a; ①、直接计算灰度的帧差 ②、对帧差进行阈值处理以获取mot…

【代码随想录训练营第42期 Day7打卡 LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

目录 一、做题心得 二、题目及题解 454.四数相加II 题目链接 题解 383. 赎金信 题目链接 题解 15. 三数之和 题目链接 题解 18. 四数之和 题目链接 题解 三、小结 一、做题心得 今天是代码随想录训练营打卡的第七天&#xff0c;做的也是同昨天一样的哈希表部分…

CUDA编程之grid和block详解

CUDA 文章目录 CUDAgrid和block基本的理解1维 遍历2维 遍历3维 遍历3维 打印对应的thread grid和block基本的理解 Kernel&#xff1a;Kernel不是CPU&#xff0c;而是在GPU上运行的特殊函数。你可以把Kernel想象成GPU上并行执行的任务。当你从主机&#xff08;CPU&#xff09;调…

使用Chainlit接入通义千问快速实现一个多模态的对话应用

开通灵识服务 首先需要到阿里云-模型服务灵积开通账户&#xff0c;获得apiKey 模型服务灵积 https://dashscope.aliyun.com/ 进入控制台 &#xff0c;在API-KEY管理里&#xff0c;创建一个新的API-KEY,然后保存起来&#xff0c;后面会用到。 模型服务灵积服务所有API文档地址…

KUKA机器人外部自动IO信号经验分享

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

k8s学习--k8s集群部署kubesphere的详细过程

文章目录 kubesphere简介k8s群集部署kubespere环境准备工作一、配置nfs二、配置storageclass三、kubesphere开启服务(devops) kubesphere简介 下面是官方文档描述 KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统&#xff0c;完全开源&#xff0c;支持多…

【python】最新版抖音js逆向拿到数据,非常详细教程(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

如何压缩pdf文件大小?这5种方法,简单又实用!

如何压缩pdf文件大小&#xff1f;pdf是电脑常用的便携式文档格式&#xff0c;无论是在学术领域的论文发表&#xff0c;还是在商业场景中的合同签署&#xff0c;甚至是个人简历的提交&#xff0c;PDF文件都扮演着重要的角色。 电脑上存储pdf文件会面临一个难题&#xff0c;那就是…