關(guān)于JDK8升級(jí)17及springboot?2.x升級(jí)3.x詳細(xì)指南
JDK 8 升級(jí) 17
簡(jiǎn)介
從 JDK 8 升級(jí)到 JDK 17 的過(guò)程中,有幾個(gè)主要的變化,特別是 Java Platform Module System (JPMS) 的引入,以及一些包路徑的調(diào)整。以下是與 JDK 17 相關(guān)的一些重要變化:
Java Platform Module System (JPMS)
- 模塊化:JDK 9 引入了模塊系統(tǒng),將標(biāo)準(zhǔn) Java 庫(kù)劃分為多個(gè)模塊。這影響了 JDK 17 中的包結(jié)構(gòu)和類的組織方式。
- 模塊路徑:JDK 11 引入了
--module-path
和--add-modules
選項(xiàng),允許用戶指定模塊路徑和加載特定模塊。
Java EE APIs 移除
- JAX-RS:
javax.ws.rs.*
包現(xiàn)在不在標(biāo)準(zhǔn) Java SE 平臺(tái)上。 - JAX-WS:
javax.xml.ws.*
包現(xiàn)在不在標(biāo)準(zhǔn) Java SE 平臺(tái)上。 - JAX-B:
javax.xml.bind.*
包現(xiàn)在不在標(biāo)準(zhǔn) Java SE 平臺(tái)上。
- JAX-RS:
其他變化
JavaFX:JavaFX 已經(jīng)從標(biāo)準(zhǔn) Java SE 平臺(tái)中移除,現(xiàn)在作為一個(gè)獨(dú)立的模塊存在。
如果應(yīng)用使用了 JavaFX,確保已經(jīng)添加了 JavaFX 模塊到應(yīng)用中
JSR 355:JSR 355 定義了一些與 JavaFX 相關(guān)的包,這些包也不再包含在標(biāo)準(zhǔn) Java SE 平臺(tái)上。
JDK 17 中的新特性
- JEP 391: Foreign Function & Memory API (Incubator):提供了與外部代碼和內(nèi)存交互的能力。
- JEP 403: Sealed Classes:允許類聲明為密封,以限制繼承。
- JEP 404: Pattern Matching for switch (Preview):引入了模式匹配支持到
switch
語(yǔ)句中。 - JEP 414: Vector API (Fourth Incubator):提供了一種利用向量硬件指令的途徑。
javax.* 包移到 jakarta.*
Jakarta EE 技術(shù)棧:隨著 Java EE 轉(zhuǎn)變?yōu)?Jakarta EE,許多
javax.*
包已經(jīng)被遷移到jakarta.*
包下。這對(duì)于使用 Java Persistence API (JPA)、JSF、EJB 等技術(shù)的應(yīng)用尤為重要。- 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 升級(jí)到 JDK 17 需確保代碼中引用了正確的包名。應(yīng)該使用
jakarta.*
而不是javax.*
。
maven pom 中更新 java 版本
建議在父項(xiàng)目添加全局變量 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 升級(jí) 3.x
spring-boot 與 cloud、alibaba-cloud 的版本對(duì)應(yīng)
spring-cloud 與 spring-boot 的版本對(duì)應(yīng)詳見 spring-cloud 官方文檔
spring-alibaba-cloud 與 spring-cloud、spring-boot 的版本對(duì)應(yīng)詳見 spring-alibaba-cloud 官方文檔
redis 默認(rèn)配置調(diào)整
在 Springboot 2.x 的版本中,redis 的默認(rèn)配置是 spring.redis.*
,升級(jí)成 Springboot 3.x 以后,redis 的默認(rèn)配置調(diào)整為了spring.data.redis.*
。
若繼續(xù)使用 Springboot2.x 的 redis 配置,會(huì)導(dǎo)致獲取不到 redis 的配置。
SpringBoot 3.x 整合 Querydsl
主要問題:springboot 升級(jí) 3.0,jpa 包路徑從 javax
改成 jakarta
,在默認(rèn)情況下,無(wú)法生存 Q 類,也沒辦法使用JPAQuery
解決方法:
引入依賴。重點(diǎn):classifier 標(biāo)簽
<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>
注意:每個(gè)項(xiàng)目配置可能會(huì)有差別,在編譯時(shí)可能會(huì)報(bào)錯(cuò):
Attempt to recreate a file for type xxx
,導(dǎo)致此錯(cuò)誤的情況也不太一致??赡艿脑蛑皇且?yàn)榕渲昧?nbsp;goals,所以此處注釋掉 goals,其他情況不一定能適用此方式。
其他注意事項(xiàng)
依賴循環(huán)引用 報(bào)錯(cuò)
如果升級(jí)前的 Spring Boot 版本早于 2.6.0,且存在 spring ioc 對(duì)象的循環(huán)引用,則需要添加允許循環(huán)引用的配置,否則報(bào)錯(cuò)
spring: main: allow-circular-references: true
WebMvcConfigurerAdapter.class 找不到報(bào)錯(cuò)
Spring Boot 3 基于 Spring Framework 6,而在 Spring Framework 5.3 中,
WebMvcConfigurerAdapter
類已經(jīng)被棄用,并在后續(xù)版本中移除。解決方案
使用 WebMvcConfigurer 接口:
WebMvcConfigurerAdapter
是一個(gè)抽象適配器類,用于實(shí)現(xiàn)WebMvcConfigurer
接口。在 Spring Framework 6 中,可以直接實(shí)現(xiàn)
WebMvcConfigurer
接口來(lái)定制 Web MVC 的行為。創(chuàng)建自定義配置類:
創(chuàng)建一個(gè)新的類,實(shí)現(xiàn)
WebMvcConfigurer
接口,并重寫需要的方法。@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 自定義資源處理 } @Override public void configurePathMatch(PathMatchConfigurer configurer) { // 自定義路徑匹配 } // 其他需要的方法 }
Spring Boot 3.x 支持優(yōu)雅退出,添加以下配置開啟
# 打開優(yōu)雅退出 server: shutdown: graceful # 多長(zhǎng)時(shí)間后強(qiáng)制殺掉進(jìn)程 spring: lifecycle: timeout-per-shutdown-phase: 30s
maven 及 maven 插件的版本升級(jí)
maven 版本升級(jí)
為了確保 Maven 版本與 Java 17 兼容,應(yīng)該使用一個(gè)較新的 Maven 版本。Java 17 是一個(gè)長(zhǎng)期支持 (LTS) 版本,它是在 2021 年 9 月發(fā)布的。因此,應(yīng)該使用 Maven 3.6.0 或更高版本來(lái)確保良好的兼容性。
以下是幾個(gè)推薦的 Maven 版本及其發(fā)布日期:
- Maven 3.6.0 - 發(fā)布于 2019 年 2 月 10 日
- Maven 3.6.3 - 發(fā)布于 2020 年 3 月 10 日
- Maven 3.8.1 - 發(fā)布于 2021 年 2 月 18 日
- Maven 3.8.5 - 發(fā)布于 2022 年 5 月 23 日
Maven 3.8.5 是一個(gè)較為推薦的版本,因?yàn)樗藢?duì) Java 17 的良好支持以及一些重要的安全修復(fù)和改進(jìn)。
升級(jí) Maven 版本
查看當(dāng)前 Maven 版本:
打開終端或命令提示符,運(yùn)行以下命令來(lái)查看已安裝的 Maven 版本:
mvn --version
如果還沒有安裝 Maven,或者安裝的版本較舊,可以按照下面的步驟安裝或升級(jí)。
安裝或升級(jí) Maven:
Windows 用戶:
訪問 Apache Maven 官方下載頁(yè)面 下載最新的 Maven 版本。
解壓下載的文件到一個(gè)目錄,例如
C:\apache-maven-3.8.5
。將 Maven 的
bin
目錄添加到系統(tǒng)環(huán)境變量PATH
中。設(shè)置
M2_HOME
環(huán)境變量,值為 Maven 的安裝目錄。Linux/macOS 用戶:
使用包管理器安裝 Maven,例如對(duì)于 Ubuntu/Debian 使用
apt-get
,對(duì)于 macOS 使用brew
:sudo apt update && sudo apt install maven
或者使用 Homebrew:
brew install maven
或者從 Apache Maven 官網(wǎng)下載二進(jìn)制分發(fā)包,解壓縮到
/usr/local
或其他位置,并通過(guò)mvn --version
確認(rèn)安裝成功。
設(shè)置 Java 17 作為默認(rèn) JDK:
- Windows 用戶:
確保安裝了 Java 17,并將其路徑添加到環(huán)境變量
JAVA_HOME
中。設(shè)置
JAVA_HOME
環(huán)境變量指向 Java 17 的安裝目錄。 - Linux/macOS 用戶:
安裝 Java 17,例如使用
sdkman
或者直接從 Oracle 或 Adoptium 下載。設(shè)置
JAVA_HOME
環(huán)境變量指向 Java 17 的安裝目錄。確保
JAVA_HOME
和PATH
環(huán)境變量被正確設(shè)置。
- Windows 用戶:
驗(yàn)證 Maven 和 Java 版本:
再次運(yùn)行
mvn --version
命令,確保顯示的 Java 版本為 17,并且 Maven 版本為 3.8.5 或更高。配置 Maven 以使用 Java 17:
在
pom.xml
文件中指定 Java 17 編譯和源代碼版本,詳見 maven-compiler-plugin 版本升級(jí)
maven-compiler-plugin 版本升級(jí)
為了確保 Maven 編譯插件 (
maven-compiler-plugin
) 與 Java 17 兼容并支持 Spring Boot 3 的需求,需要選擇一個(gè)合適的maven-compiler-plugin
版本。截至2023年,
maven-compiler-plugin
的最新穩(wěn)定版本是 3.10.1。該版本與 Java 17 兼容,并且適用于 Spring Boot 3。下面是
maven-compiler-plugin
的一個(gè)示例配置,用于確保使用 Java 17 進(jìn)行編譯:<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>
這里的關(guān)鍵配置點(diǎn)包括:
<source>
和<target>
都設(shè)置為17
,以指示使用 Java 17 進(jìn)行編譯。<version>
設(shè)置為3.10.1
,這是與 Java 17 兼容的一個(gè)版本。
**請(qǐng)注意,需要根據(jù)實(shí)際的 Maven 和 Spring Boot 版本進(jìn)行適當(dāng)?shù)恼{(diào)整。**如果需要使用特定版本的
maven-compiler-plugin
,請(qǐng)查閱官方文檔或發(fā)布頁(yè)面以確認(rèn)版本的兼容性。`
總結(jié)
到此這篇關(guān)于關(guān)于JDK8升級(jí)17及springboot 2.x升級(jí)3.x的文章就介紹到這了,更多相關(guān)JDK8升級(jí)17及springboot2.x升級(jí)3.x內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何通過(guò)eclipse web項(xiàng)目導(dǎo)入itellij idea并啟動(dòng)
這篇文章主要介紹了如何通過(guò)eclipse web項(xiàng)目導(dǎo)入itellij idea并啟動(dòng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12Spring?IoC容器Bean作用域的singleton與prototype使用配置
這篇文章主要為大家介紹了Spring?IoC容器Bean作用域的singleton與prototype使用配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Mybatis基于xml配置實(shí)現(xiàn)單表的增刪改查功能
這篇文章主要介紹了Mybatis基于xml配置實(shí)現(xiàn)單表的增刪改查,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解
這篇文章主要介紹了Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫(kù)中的一個(gè)類,BeanMap?可以將?Java?對(duì)象的屬性作為鍵,屬性值作為對(duì)應(yīng)的值,存儲(chǔ)在一個(gè)?Map?中,它提供了一種將?Java?對(duì)象轉(zhuǎn)換為?Map?的方式,需要的朋友可以參考下2024-01-01Spring啟動(dòng)時(shí)實(shí)現(xiàn)初始化有哪些方式?
今天給大家?guī)?lái)的文章是關(guān)于Spring的相關(guān)知識(shí),文章圍繞著Spring啟動(dòng)時(shí)實(shí)現(xiàn)初始化有哪些方式展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06springboot @Valid注解對(duì)嵌套類型的校驗(yàn)功能
這篇文章主要介紹了springboot~@Valid注解對(duì)嵌套類型的校驗(yàn),主要介紹 @Valid在項(xiàng)目中的使用,需要的朋友可以參考下2018-05-05Java 8函數(shù)式接口Function BiFunction DoubleFunction
這篇文章主要為大家介紹了Java 8函數(shù)式接口Function BiFunction DoubleFunction區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07