欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JDK從8升級(jí)到21的問(wèn)題集(附案例代碼)

 更新時(shí)間:2025年09月08日 09:35:52   作者:京東云開(kāi)發(fā)者  
JDK 8升級(jí)到JDK 21是一個(gè)重要的版本遷移,涉及語(yǔ)法、模塊化、API變更等多方面調(diào)整,這篇文章主要介紹了JDK從8升級(jí)到21問(wèn)題的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、背景與挑戰(zhàn)

1.升級(jí)動(dòng)因

?Oracle長(zhǎng)期支持策略

?現(xiàn)代特性需求:協(xié)程、模式匹配、ZGC等

?安全性與性能的需求

?AI新技術(shù)引入的版本要求

2.項(xiàng)目情況

?100+項(xiàng)目并行升級(jí)的協(xié)同作戰(zhàn)

?多技術(shù)棧并存

?持續(xù)集成體系的適配挑戰(zhàn)

二、進(jìn)度

應(yīng)用總數(shù)已完成應(yīng)用下線(xiàn)待升級(jí)
100+731310+

三、主要問(wèn)題域與解決方案

1. 依賴(lài)管理的"蝴蝶效應(yīng)"

•sun.misc.BASE64Encoder等內(nèi)部API廢棄 → 引發(fā)編譯錯(cuò)誤

•JAXB/JAX-WS從JDK核心剝離 → XML處理鏈斷裂

•Lombok與新版編譯器兼容性問(wèn)題(尤其record類(lèi)型)

核心原因在于JEP320提案:https://openjdk.org/jeps/320

案例1:歷史SDK的編譯陷阱

Compilation failure: Compilation failure:
#14 4.173 [ERROR] 不再支持源選項(xiàng) 6。請(qǐng)使用 8 或更高版本。
#14 4.173 [ERROR] 不再支持目標(biāo)選項(xiàng) 6。請(qǐng)使用 8 或更高版本。
<!-- 舊版本編譯器配置導(dǎo)致構(gòu)建失敗 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.13.0</version>
    <configuration>
        <release>8</release><!-- 統(tǒng)一使用release參數(shù) -->
    </configuration>
</plugin>

運(yùn)行 HTML

案例2:JAXB的模塊化剝離

javax.xml.bind.JAXBException:Implementation of JAXB-API has not been found
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>4.0.5</version>
</dependency>

案例3:Lombok與新版編譯器兼容性問(wèn)題

java: java.lang.NoSuchFieldError
<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>1.18.30</version>
</dependency>

案例4:Resource注解找不到

Caused by: java.lang.NoSuchMethodError: 'java.lang.String javax.annotation.Resource.lookup()'
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.<init>(CommonAnnotationBeanPostProcessor.java:664)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.lambda$buildResourceMetadata$0(CommonAnnotationBeanPostProcessor.java:395)
at org.springframework.util.ReflectionUtils.doWithLocalFields(ReflectionUtils.java:669)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.buildResourceMetadata(CommonAnnotationBeanPostProcessor.java:377)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.findResourceMetadata(CommonAnnotationBeanPostProcessor.java:358)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(CommonAnnotationBeanPostProcessor.java:306)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:1116)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
... 37 more
<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>1.3.5</version>
</dependency>

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

上述兩個(gè)依賴(lài)代碼基本一樣,推薦使用該版本:

jakarta.annotation:jakarta.annotation-api。

2. 模塊化的破與立

反射訪(fǎng)問(wèn)的模塊墻

[ERROR] Unable to make field private int java.text.SimpleDateFormat.serialVersionOnStream accessible
# 啟動(dòng)參數(shù)添加模塊開(kāi)放配置
--add-opens java.base/java.text=ALL-UNNAMED
--add-opens java.base/java.lang.reflect=ALL-UNNAMED

完整模塊開(kāi)放配置模板

export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xmx4096m --add-opens java.base/sun.security.action=ALL-UNNAMED
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.math=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/sun.util.calendar=ALL-UNNAMED
--add-opens java.base/java.util.concurrent=ALL-UNNAMED
--add-opens java.base/java.util.concurrent.locks=ALL-UNNAMED
--add-opens java.base/java.security=ALL-UNNAMED
--add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.base/sun.nio.ch=ALL-UNNAMED
--add-opens java.management/java.lang.management=ALL-UNNAMED
--add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
--add-opens java.base/sun.security.action=ALL-UNNAMED
--add-opens java.base/sun.net.util=ALL-UNNAMED
--add-opens java.base/java.time=ALL-UNNAMED
--add-opens java.base/java.lang.reflect=ALL-UNNAMED
--add-opens java.base/java.io=ALL-UNNAMED"

3. 語(yǔ)法層面的"時(shí)空穿越"

案例1:Base64編解碼改造

// JDK8寫(xiě)法(已廢棄)
BASE64Encoder encoder =newBASE64Encoder();
String encoded = encoder.encode(data);
// JDK21規(guī)范寫(xiě)法
Base64.Encoder encoder =Base64.getEncoder();
String encoded = encoder.encodeToString(data);

案例2:日期序列化問(wèn)題

Caused by:java.lang.reflect.InaccessibleObjectException: 
Unable to make field private int java.text.SimpleDateFormat.serialVersionOnStream accessible

解決方案

1.使用DateTimeFormatter替代SimpleDateFormat

2.或添加模塊開(kāi)放參數(shù):--add-opens java.base/java.text=ALL-UNNAMED

4. 隱秘的"依賴(lài)戰(zhàn)爭(zhēng)"

注解包沖突典型案例

[ERROR] javax.annotation.Resource exists in both 
jsr250-api-1.0.jar and jakarta.annotation-api-1.3.5.jar
<!-- 統(tǒng)一使用Jakarta標(biāo)準(zhǔn) -->
<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>2.1.1</version>
</dependency>
<!-- 排除舊版本依賴(lài) -->
<exclusions>
    <exclusion>
        <groupId>javax.annotation</groupId>
        <artifactId>jsr250-api</artifactId>
    </exclusion>
</exclusions>

5. 構(gòu)建體系的改造

Maven插件兼容性問(wèn)題

[ERROR] The plugin org.apache.maven.plugins:maven-compiler-plugin:3.13.0 
requires Maven version 3.6.3

升級(jí)策略

1.升級(jí)Maven版本

2.統(tǒng)一插件版本

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.4.0</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

四、最佳實(shí)踐總結(jié)

1. 本地編譯

第一步:在本地進(jìn)行編譯,提前識(shí)別出語(yǔ)法錯(cuò)誤、版本沖突及不兼容問(wèn)題。

主要有以下幾種場(chǎng)景:

Base64:參照 【Base64編解碼改造】

lombok:升級(jí)版本

jsr250、jaxb-runtime、jakarta.annotation-api:參照 【注解包沖突典型案例】

maven-compiler-plugin:升級(jí)版本

maven-resources-plugin:升級(jí)版本

maven-war-plugin:升級(jí)版本

2. 行云構(gòu)建

同【本地編譯】

3. 行云部署

a、鏡像不匹配:自定義鏡像或者使用已申請(qǐng)的jdk21鏡像

b、module權(quán)限不夠:參照【完整模塊開(kāi)放配置模板

c、JDSecurity加解密

所有數(shù)據(jù)庫(kù)操作:important.properties配置文件的處理方式

classpath:important.properties 使用PropertyPlaceholderConfigurer進(jìn)行處理,不要用JDSecurityPropertyFactoryBean。

<!--    <bean id ="secApplicationProperties" class="com.jd.security.configsec.spring.config.JDSecurityPropertyFactoryBean">-->
<!--       <property name="ignoreResourceNotFound" value="true" />-->
<!--       <property name="secLocation" value="classpath:important.properties"/>-->
<!--    </bean>-->

4. 運(yùn)行

a、序列化異常

jdk21使用列表視圖作為入?yún)ⅲ瑢?dǎo)致jsf接口進(jìn)行反序列化報(bào)錯(cuò)。報(bào)錯(cuò)代碼如下:

List<String> subList = venderCodes.subList(i * batchSize, Math.min(venderCodes.size(), (i + 1) * batchSize));
VendorQueryVo vendorQueryVo = new VendorQueryVo();
vendorQueryVo.setVendorCodes(subList);
// 該接口最多支持100條調(diào)用
List<VendorVo> batchVendorNameByVendorCode = vendorBaseInfoService.getBatchVendorNameByVendorCode(vendorQueryVo, I18NParamFactory.getJDI18nParam());

將 vendorQueryVo.setVendorCodes(subList) 修改為vendorQueryVo.setVendorCodes(new ArrayList<>(subList)) 即可解決問(wèn)題

b、線(xiàn)程上下文類(lèi)找不到:使用多線(xiàn)程場(chǎng)景下盡可能使用顯式指定線(xiàn)程池【默認(rèn)情況下 不同運(yùn)行環(huán)境的處理機(jī)制不同】

5. JVM調(diào)優(yōu)

垃圾回收調(diào)優(yōu)

UseParallelGC、UseG1GCUseZGC是 Java 虛擬機(jī)(JVM)中三種不同的垃圾回收器(Garbage Collector, GC),它們的設(shè)計(jì)目標(biāo)和使用場(chǎng)景有所不同。以下是它們的區(qū)別:

特性UseParallelGCUseG1GCUseZGC
設(shè)計(jì)目標(biāo)高吞吐量平衡吞吐量和延遲極低延遲
暫停時(shí)間較長(zhǎng)較短極短
適用堆大小中小堆(幾 GB 到幾十 GB)大堆(幾十 GB 到幾百 GB)超大堆(TB 級(jí)別)
CPU 消耗中等中等較高
適用場(chǎng)景批處理、計(jì)算密集型任務(wù)對(duì)延遲有一定要求的應(yīng)用對(duì)延遲極其敏感的應(yīng)用

•如果你的應(yīng)用對(duì)吞吐量要求高,且可以接受較長(zhǎng)的暫停時(shí)間,選擇UseParallelGC。

•如果你的應(yīng)用對(duì)延遲有一定要求,且堆內(nèi)存較大,選擇UseG1GC。

•如果你的應(yīng)用對(duì)延遲極其敏感,且堆內(nèi)存非常大,選擇UseZGC。

僅供參考,具體請(qǐng)按照實(shí)際情況來(lái)進(jìn)行調(diào)整。

作者:京東工業(yè) 韋付芝

總結(jié)

到此這篇關(guān)于JDK從8升級(jí)到21問(wèn)題集的文章就介紹到這了,更多相關(guān)JDK8升級(jí)到21的問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java版超大整數(shù)階乘算法代碼詳解-10,0000級(jí)

    Java版超大整數(shù)階乘算法代碼詳解-10,0000級(jí)

    這篇文章主要介紹了Java版超大整數(shù)階乘算法代碼詳解-10,0000級(jí),具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Spring的FactoryBean<Object>接口示例代碼

    Spring的FactoryBean<Object>接口示例代碼

    FactoryBean是Spring框架中的一個(gè)接口,用于創(chuàng)建和管理Bean對(duì)象,它的作用是將Bean的創(chuàng)建過(guò)程交給FactoryBean實(shí)現(xiàn)類(lèi)來(lái)完成,而不是直接由Spring容器來(lái)創(chuàng)建,本文給大家介紹Spring的FactoryBean<Object>接口,感興趣的朋友一起看看吧
    2023-11-11
  • 深入剖析Java ArrayQueue(JDK)的源碼

    深入剖析Java ArrayQueue(JDK)的源碼

    本篇文章主要給大家介紹一個(gè)比較簡(jiǎn)單的JDK為我們提供的容器ArrayQueue,這個(gè)容器主要是用數(shù)組實(shí)現(xiàn)的一個(gè)單向隊(duì)列,整體的結(jié)構(gòu)相對(duì)其他容器來(lái)說(shuō)就比較簡(jiǎn)單了,感興趣的可以了解一下
    2022-08-08
  • SpringBoot加載多個(gè)配置文件實(shí)現(xiàn)dev、product多環(huán)境切換的方法

    SpringBoot加載多個(gè)配置文件實(shí)現(xiàn)dev、product多環(huán)境切換的方法

    這篇文章主要介紹了SpringBoot加載多個(gè)配置文件實(shí)現(xiàn)dev、product多環(huán)境切換,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Java中Stream流中map和forEach的區(qū)別詳解

    Java中Stream流中map和forEach的區(qū)別詳解

    本文主要介紹了Java中Stream流中map和forEach的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • JAVA面向?qū)ο笾^承?super入門(mén)解析

    JAVA面向?qū)ο笾^承?super入門(mén)解析

    在JAVA類(lèi)中使用super來(lái)引用父類(lèi)的成分,用this來(lái)引用當(dāng)前對(duì)象,如果一個(gè)類(lèi)從另外一個(gè)類(lèi)繼承,我們new這個(gè)子類(lèi)的實(shí)例對(duì)象的時(shí)候,這個(gè)子類(lèi)對(duì)象里面會(huì)有一個(gè)父類(lèi)對(duì)象。怎么引用里面的父類(lèi)對(duì)象呢?用super來(lái)引用,this指當(dāng)前對(duì)象的引用,super是當(dāng)前對(duì)象里面的父對(duì)象的引用
    2022-01-01
  • SSH框架實(shí)現(xiàn)表單上傳圖片實(shí)例代碼

    SSH框架實(shí)現(xiàn)表單上傳圖片實(shí)例代碼

    本篇文章主要介紹了SSH框架實(shí)現(xiàn)表單上傳圖片實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • java將word轉(zhuǎn)pdf的方法示例詳解

    java將word轉(zhuǎn)pdf的方法示例詳解

    這篇文章主要介紹了java將word轉(zhuǎn)pdf的相關(guān)資料,文中講解了使用Aspose-Words工具將Word文檔轉(zhuǎn)換為PDF的優(yōu)劣,并提供了一種在Java項(xiàng)目中使用Aspose-Words進(jìn)行Word轉(zhuǎn)PDF的示例方法,需要的朋友可以參考下
    2025-01-01
  • 如何優(yōu)雅的進(jìn)行Spring整合MongoDB詳解

    如何優(yōu)雅的進(jìn)行Spring整合MongoDB詳解

    這篇文章主要給大家介紹了如何優(yōu)雅的進(jìn)行Spring整合MongoDB的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • maven的settings.xml、pom.xml配置文件使用詳解

    maven的settings.xml、pom.xml配置文件使用詳解

    本文詳解了Maven中的配置文件settings.xml和pom.xml,闡述了它們的作用、配置項(xiàng)以及優(yōu)先級(jí)順序,settings.xml存在于Maven安裝目錄和用戶(hù)目錄下,分別作用于全局和當(dāng)前用戶(hù),pom.xml位于項(xiàng)目根路徑下
    2024-09-09

最新評(píng)論