国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JDK8升級(jí)JDK17過程中遇到的那些坑

這篇具有很好參考價(jià)值的文章主要介紹了JDK8升級(jí)JDK17過程中遇到的那些坑。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1 前言

JDK8雖然非常好,但是JDK版本已經(jīng)發(fā)布到JDK20了,且JDK8后的版本升級(jí)了很多新的特性,如模塊化、ZGC以及虛擬線程、結(jié)構(gòu)性并發(fā)等,也是非常有吸引力的,所以決定將基于JDK8的項(xiàng)目升級(jí)到最近的LTS版本JDK17。

2 升級(jí)過程記錄

2.1 安裝JDK17

下載JDK17的最新版本jdk-17_linux-x64_bin.tar.gz,解壓縮后移動(dòng)到/usr/lib/jvm/目錄下

$ sudo su -
# tar -xzf jdk-17_linux-x64_bin.tar.gz
# mv jdk-17.0.2 /usr/lib/jvm/java-17
復(fù)制代碼

然后修改~/.bashrc,設(shè)置java相關(guān)環(huán)境變量為JDK17

# vim ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-17
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
復(fù)制代碼

環(huán)境變量生效后,檢查當(dāng)前的jdk版本為JDK17

# source ~/.bashrc

# java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)
復(fù)制代碼

2.2 升級(jí)spring版本并編譯

修改項(xiàng)目的pom.xml文件,將spring boot和spring cloud版本由

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
    </properties>
    
復(fù)制代碼

修改為最新正式發(fā)布版本:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <spring-cloud.version>2022.0.2</spring-cloud.version>
    </properties>
復(fù)制代碼

編譯項(xiàng)目,報(bào)以下錯(cuò)誤:

程序包javax.servlet.http不存在
程序包javax.validation不存在
復(fù)制代碼

原因是原先javax包的名字改為jakarta了,將項(xiàng)目中所有依賴javax包的地方替換為jakarta

繼續(xù)編譯,報(bào)以下錯(cuò)誤:

[ERROR] 找不到符號(hào)
[ERROR]   符號(hào):   類 EnableEurekaClient
[ERROR]   位置: 程序包 org.springframework.cloud.netflix.eureka
復(fù)制代碼

原因是新版本沒有@EnableEurekaClient注解了,替換為@EnableDiscoveryClient

繼續(xù)編譯,報(bào)以下錯(cuò)誤:

[ERROR]  找不到符號(hào)
[ERROR]   符號(hào):   方法 apply()
[ERROR]   位置: 接口 io.github.resilience4j.core.functions.CheckedSupplier<java.lang.Object>
復(fù)制代碼

原因是resilience4jCheckedSupplier接口新版本沒有apply()方法了,改為get()方法

繼續(xù)編譯,報(bào)以下錯(cuò)誤:

[ERROR]  對(duì)于RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.util.Date), 找不到合適的構(gòu)造器
[ERROR]     構(gòu)造器 feign.RetryableException.RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.lang.Throwable,java.util.Date,feign.Request)不適用
[ERROR]       (實(shí)際參數(shù)列表和形式參數(shù)列表長(zhǎng)度不同)
[ERROR]     構(gòu)造器 feign.RetryableException.RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.util.Date,feign.Request)不適用
[ERROR]       (實(shí)際參數(shù)列表和形式參數(shù)列表長(zhǎng)度不同)
復(fù)制代碼

原因是openfeign新版本的RetryableException異常類的構(gòu)造函數(shù)發(fā)生了變化,根據(jù)需要將舊代碼:

    @Bean
    public ErrorDecoder feignError() {
        return (key, response) -> {
            if (response.status() >= 500) {
                FeignException exception = FeignException.errorStatus(key, response);
                return new RetryableException(
                        response.status(),
                        exception.getMessage(),
                        response.request().httpMethod(),
                        new Date());
            }

            // 其他異常交給Default去解碼處理
            return defaultErrorDecoder.decode(key, response);
        };
    }

復(fù)制代碼

改為以下代碼

    @Bean
    public ErrorDecoder feignError() {
        return (key, response) -> {
            if (response.status() >= 500) {
                FeignException exception = FeignException.errorStatus(key, response);
                return new RetryableException(
                        response.status(),
                        exception.getMessage(),
                        response.request().httpMethod(),
                        new Date(),
                        response.request());
            }

            // 其他異常交給Default去解碼處理
            return defaultErrorDecoder.decode(key, response);
        };
    }
復(fù)制代碼

改為后繼續(xù)編譯,報(bào)以下錯(cuò)誤:

程序包org.junit不存在
程序包org.junit.runner不存在
程序包junit.framework不存在
復(fù)制代碼

這是因?yàn)榕f版本使用的是junit4,改為junit5相應(yīng)的注解。即將:

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

@Ignore
@RunWith(MockitoJUnitRunner.class)
public class FileSyncerTest {
    
    @Before
    public void setUp() {

    }
    
    @Test
    public void testCase1() throws Exception {
    
    }

}
復(fù)制代碼

改為

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;


@Disabled
@ExtendWith(MockitoExtension.class)
public class FileSyncerTest {
    
    @BeforeEach
    public void setUp() {

    }
    
    @Test
    public void testCase1() throws Exception {
    
    }

}

復(fù)制代碼

改為后繼續(xù)編譯,編譯通過。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.582 s (Wall Clock)
[INFO] Finished at: 2023-05-04T16:39:42+08:00
[INFO] Final Memory: 59M/214M
[INFO] ------------------------------------------------------------------------
復(fù)制代碼

2.3 啟動(dòng)項(xiàng)目

編譯通過后啟動(dòng)項(xiàng)目,啟動(dòng)失敗,報(bào)以下錯(cuò)誤:

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @7634b327
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
	at net.sf.cglib.core.ReflectUtils$2.run(ReflectUtils.java:56)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
	at net.sf.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:46)
復(fù)制代碼

這是因?yàn)閺腏DK9開始支持模塊化了,項(xiàng)目中使用的部分組件可能還沒有支持模塊化,所以需要在jar包啟動(dòng)時(shí)添加add-opens jvm啟動(dòng)參數(shù)參數(shù),我是通過在pom文件中添加build參數(shù)實(shí)現(xiàn)的:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 添加 add-opens jvm參數(shù) -->
                    <jvmArguments>--add-opens java.base/java.lang=ALL-UNNAMED</jvmArguments>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
復(fù)制代碼

修改完后重新編譯啟動(dòng),啟動(dòng)仍然失敗,報(bào)以下錯(cuò)誤:

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
Caused by: java.lang.NullPointerException: null
復(fù)制代碼

這是因?yàn)轫?xiàng)目中使用了knife4j,由于版本比較低,底層依賴的是spring-fox,支持的是openapi 2.x版本,而spring boot 3.0只支持openapi 3.x版本,所以knife4j版本依賴由:

    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-spring-boot-starter</artifactId>
        <version>2.0.5</version>
    </dependency>
復(fù)制代碼

改為:

    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
        <version>4.1.0</version>
    </dependency>
復(fù)制代碼

同時(shí)將swagger的相關(guān)注解@Api、@ApiOperation、@ApiParam、@ApiModel 、@ApiModelProperty替換為openapi3對(duì)應(yīng)的注解:@Tag@Operation、 @Parameter、 @Schema、 @SchemaProperty

修改完后,重新編譯啟動(dòng),這次能正常啟動(dòng)了

但是web訪問項(xiàng)目接口時(shí)報(bào)以下錯(cuò)誤:

Caused by: java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead.
	at org.springframework.web.cors.CorsConfiguration.validateAllowCredentials(CorsConfiguration.java:516)
	at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:538)
	at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1275)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
	... 36 common frames omitted

復(fù)制代碼

這個(gè)是跨域的問題,新版本spring MVC的CorsRegistry已經(jīng)沒有allowedOrigin() 方法了,替換為新接口allowedOriginPatterns()即可,代碼示例如下:

@Configuration
public class WebCorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}
復(fù)制代碼

到此升級(jí)完成!

作者:movee
鏈接:https://juejin.cn/post/7229250736115138621文章來源地址http://www.zghlxwxcb.cn/news/detail-505050.html

到了這里,關(guān)于JDK8升級(jí)JDK17過程中遇到的那些坑的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Mac卸載jdk8,安裝jdk17

    Mac卸載jdk8,安裝jdk17

    本次操作基于MacBook 因?yàn)楣ぷ餍枰?,需要將jdk版本由jdk8升級(jí)到j(luò)dk17,同一臺(tái)機(jī)器上是可以同時(shí)安裝多個(gè)版本的jdk的,但是為了避免一些沖突和未知問題,這里直接卸載舊版本jdk,然后再重新安裝新版本。 先查看本機(jī)安裝的jdk: 刪除java運(yùn)行環(huán)境: 到j(luò)ava的目錄,用ls命令查看機(jī)

    2024年02月08日
    瀏覽(27)
  • JDK8 升級(jí)至JDK19

    JDK8 升級(jí)至JDK19

    優(yōu)質(zhì)博文IT-BLOG-CN 目前部分項(xiàng)目使用 JDK8 ,部分項(xiàng)目使用 JDK19 因此,環(huán)境變量中還是保持 JDK8 ,只需要下載 JDK19 免安裝版本,通過配置 IDEA 就可以完成本地開發(fā)。 【1】通過快捷鍵 CTRL + SHIFT + ALT + S 或者 File-Project Structure... 設(shè)置 SDK 和 Language level ,不存在 JDK19 時(shí)可通過 Edit

    2024年02月19日
    瀏覽(16)
  • java jdk8和jdk17同時(shí)存在【環(huán)境配置】

    java jdk8和jdk17同時(shí)存在【環(huán)境配置】

    jdk8:https://www.oracle.com/cn/java/technologies/javase/javase8u211-later-archive-downloads.html jdk17:https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html PS:jdk8在下載結(jié)束,安裝的時(shí)候,需要有兩個(gè)文件分別是jre和jdk JRE: 是Java Runtime Environment,是java程序的運(yùn)行環(huán)境。既然是運(yùn)行,當(dāng)然要包含

    2024年02月07日
    瀏覽(31)
  • JDK8和JDK17安裝切換,IDEA配置多個(gè)版本JDK

    JDK8和JDK17安裝切換,IDEA配置多個(gè)版本JDK

    JAVA之父高斯林推薦我們用JDK17,請(qǐng)盡快離開JDK8。JDK17 LTS在每個(gè)維度上都是一個(gè)巨大的飛躍: 在Java 17正式發(fā)布之前,Java開發(fā)框架Spring率先在官博宣布,Spring Framework 6和Spring Boot 3計(jì)劃在2022年第四季度實(shí)現(xiàn)總體可用性的高端基線: Java 17+(來自 Spring Framework 5.3.x 線中的 Java 8-17)

    2023年04月27日
    瀏覽(27)
  • JDK8,JDK11,JDK17,JDK21及中間版本主要更新特性

    JDK8,JDK11,JDK17,JDK21及中間版本主要更新特性

    官方地址: https://www.oracle.com/java/technologies/java-se-support-roadmap.html 從上圖可以很清晰得可以看出,JDK7,JDK8,JDK11,JDK17,JDK21是長(zhǎng)期維護(hù)的版本。從目前來看,JDK8到2023年已經(jīng)有將近10年的歷史了,大多數(shù)依據(jù)JDK8的相關(guān)技術(shù)內(nèi)容已經(jīng)很成熟了,但是大家也看到,JDK在不斷地迭代,JD

    2024年02月21日
    瀏覽(25)
  • JDK8到JDK17有哪些吸引人的新特性?

    作者:京東零售?劉一達(dá) 2006年之后SUN公司決定將JDK進(jìn)行開源,從此成立了OpenJDK組織進(jìn)行JDK代碼管理。任何人都可以獲取該源碼,并通過源碼構(gòu)建一個(gè)發(fā)行版發(fā)布到網(wǎng)絡(luò)上。但是需要一個(gè)組織審核來確保構(gòu)建的發(fā)行版是有效的, 這個(gè)組織就是JCP(Java Community Process)。2009年,SUN公

    2023年04月18日
    瀏覽(31)
  • JDK8升級(jí)JDK11最全實(shí)踐干貨來了

    截至目前(2023年),Java8發(fā)布至今已有9年,2018年9月25日,Oracle發(fā)布了Java11,這是Java8之后的首個(gè)LTS版本。那么從JDK8到JDK11,到底帶來了哪些特性呢?值得我們升級(jí)嗎?而且升級(jí)過程會(huì)遇到哪些問題呢?帶著這些問題,本篇文章將帶來完整的JDK8升級(jí)JDK11最全實(shí)踐。 1)性能提升

    2024年02月08日
    瀏覽(24)
  • 一文詳解|從 JDK8 飛升到 JDK17,再到未來的 JDK21

    ?? Lambda 表達(dá)式和函數(shù)式接口 定義 :允許將函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù))或?qū)⒋a作為數(shù)據(jù)(函數(shù)作為值)。 示例 : (a, b) - a + b ?? 類型注解 定義 :提供了在任何使用類型的地方添加注解的能力。 示例 : @NonNull String name; ?? 新的日期/時(shí)間 API 定義 :全新的

    2024年01月17日
    瀏覽(67)
  • 如何在MAC M1上同時(shí)安裝JDK8和JDK17

    如何在MAC M1上同時(shí)安裝JDK8和JDK17

    筆者原先就在電腦上安裝了JDK8,由于需要用到MAT,MAT支持MAC m1的只兼容JDK17及以上的版本,故需安裝JDK17,特此記錄。 首先,從oracle官網(wǎng)下載JDK17:https://www.oracle.com/java/technologies/downloads/#java17 JDK默認(rèn)安裝在/Library/Java目錄下,打開訪達(dá),通過shift+command+g直達(dá)文件,如果安裝成

    2024年02月15日
    瀏覽(25)
  • linux和mac系統(tǒng)jdk8升級(jí)jdk11

    linux和mac系統(tǒng)jdk8升級(jí)jdk11

    一、為什么升級(jí) 因?yàn)樵谥拔野裫enkins版本從2.328升級(jí)到了2.387,導(dǎo)致的我的從節(jié)點(diǎn)需要重新連接,但在連接過程中發(fā)現(xiàn)新版jenkins不支持jdk8了,于是開始升級(jí)jdk11,接下來開干。 二、linux 升級(jí) jdk11 1、安裝jdk11 2、切換java版本 三、macos 升級(jí) jdk11 1、下載jdk11 2、安裝軟連接 3、環(huán)

    2024年02月11日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包