在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JDK從8升級到21的問題集

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2025-06-06 16:49 ? 次閱讀

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

1.升級動(dòng)因

?Oracle長期支持策略

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

?安全性與性能的需求

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

2.項(xiàng)目情況

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

?多技術(shù)棧并存

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

?

二、進(jìn)度

應(yīng)用總數(shù) 已完成 應(yīng)用下線 待升級
100+ 73 13 10+

?

三、主要問題域與解決方案

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

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

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

?Lombok與新版編譯器兼容性問題(尤其record類型)

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

?

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

Compilation failure: Compilation failure:
#14 4.173 [ERROR] 不再支持源選項(xiàng) 6。請使用 8 或更高版本。
#14 4.173 [ERROR] 不再支持目標(biāo)選項(xiàng) 6。請使用 8 或更高版本。



    org.apache.maven.plugins
    maven-compiler-plugin
    3.5
    
        1.6
        1.6
    



    org.apache.maven.plugins
    maven-compiler-plugin
    3.13.0
    
        8
    


運(yùn)行 HTML

案例2:JAXB的模塊化剝離

javax.xml.bind.JAXBException:Implementation of JAXB-API has not been found


    org.glassfish.jaxb
    jaxb-runtime
    4.0.5


案例3:Lombok與新版編譯器兼容性問題

java: java.lang.NoSuchFieldError


 org.projectlombok
 lombok
 1.18.30


案例4:Resource注解找不到

Caused by: java.lang.NoSuchMethodError: 'java.lang.String javax.annotation.Resource.lookup()'
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.(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


    jakarta.annotation
    jakarta.annotation-api
    1.3.5



    javax.annotation
    javax.annotation-api
    1.3.2


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

jakarta.annotation:jakarta.annotation-api。

?

2. 模塊化的破與立

反射訪問的模塊墻

[ERROR] Unable to make field private int java.text.SimpleDateFormat.serialVersionOnStream accessible

# 啟動(dòng)參數(shù)添加模塊開放配置
--add-opens java.base/java.text=ALL-UNNAMED
--add-opens java.base/java.lang.reflect=ALL-UNNAMED

完整模塊開放配置模板

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. 語法層面的"時(shí)空穿越"

案例1:Base64編解碼改造

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

案例2:日期序列化問題

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

解決方案

1.使用DateTimeFormatter替代SimpleDateFormat

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

?

4. 隱秘的"依賴戰(zhàn)爭"

注解包沖突典型案例

[ERROR] javax.annotation.Resource exists in both 
jsr250-api-1.0.jar and jakarta.annotation-api-1.3.5.jar



    jakarta.annotation
    jakarta.annotation-api
    2.1.1



    
        javax.annotation
        jsr250-api
    


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

Maven插件兼容性問題

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

升級策略

1.升級Maven版本

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


    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.13.0
            
            
                org.apache.maven.plugins
                maven-war-plugin
                3.4.0
            
        
    


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

1. 本地編譯

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

主要有以下幾種場景:

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

lombok:升級版本

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

maven-compiler-plugin:升級版本

maven-resources-plugin:升級版本

maven-war-plugin:升級版本

?

?

2. 行云構(gòu)建

同【本地編譯】

?

3. 行云部署

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

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

c、JDSecurity加解密

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

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


-->
-->
-->

?

4. 運(yùn)行

a、序列化異常

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

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

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

?

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

?

?

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

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

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

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

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

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

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

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

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • JDK
    JDK
    +關(guān)注

    關(guān)注

    0

    文章

    83

    瀏覽量

    16841
收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32MP157d linux5.4.31升級到6.1.82無法啟動(dòng)怎么解決?

    我以前一直使用linux5.4.31,只使用了TFA沒有optee uboot是2020版本。一直用得好好的 上個(gè)禮拜我想升級到6.1.82(主要想打RT linux patch, 看到STM有出
    發(fā)表于 06-10 07:31

    STM32MP157d linux5.4.31升級到6.1.82無法啟動(dòng)怎么解決?

    我以前一直使用linux5.4.31,只使用了TFA沒有optee uboot是2020版本。一直用得好好的 上個(gè)禮拜我想升級到6.1.82(主要想打RT linux patch, 看到STM有出
    發(fā)表于 06-06 06:42

    STM32MP157d linux5.4.31升級到6.1.82無法啟動(dòng)怎么解決?

    我以前一直使用linux5.4.31,只使用了TFA沒有optee uboot是2020版本。一直用得好好的 上個(gè)禮拜我想升級到6.1.82(主要想打RT linux patch, 看到STM有出
    發(fā)表于 05-21 06:20

    STM32MP157d linux5.4.31升級到6.1.82無法啟動(dòng)的原因?

    我以前一直使用linux5.4.31,只使用了TFA沒有optee uboot是2020版本。一直用得好好的 上個(gè)禮拜我想升級到6.1.82(主要想打RT linux patch, 看到STM有出
    發(fā)表于 04-27 06:30

    6.12.1升級到6.13老是閃退是什么原因?qū)е碌模?/a>

    6.12.1升級到6.13老是閃退,回到6.12.1又正常,問一下大家是什么原因?qū)е拢惺裁唇鉀Q辦法?
    發(fā)表于 03-11 08:13

    ADS7813升級到ADS8513

    電子發(fā)燒友網(wǎng)站提供《ADS7813升級到ADS8513.pdf》資料免費(fèi)下載
    發(fā)表于 10-21 09:59 ?0次下載
    <b class='flag-5'>從</b>ADS7813<b class='flag-5'>升級到</b>ADS8513

    升級到TVP5146M2

    電子發(fā)燒友網(wǎng)站提供《升級到TVP5146M2.pdf》資料免費(fèi)下載
    發(fā)表于 10-08 14:40 ?0次下載
    <b class='flag-5'>升級到</b>TVP5146M2

    升級到TVP5147M1

    電子發(fā)燒友網(wǎng)站提供《升級到TVP5147M1.pdf》資料免費(fèi)下載
    發(fā)表于 09-30 09:08 ?0次下載
    <b class='flag-5'>升級到</b>TVP5147M1

    JESD204B升級到JESD204C時(shí)的系統(tǒng)設(shè)計(jì)注意事項(xiàng)

    電子發(fā)燒友網(wǎng)站提供《JESD204B升級到JESD204C時(shí)的系統(tǒng)設(shè)計(jì)注意事項(xiàng).pdf》資料免費(fèi)下載
    發(fā)表于 09-21 10:19 ?6次下載
    <b class='flag-5'>從</b>JESD204B<b class='flag-5'>升級到</b>JESD204C時(shí)的系統(tǒng)設(shè)計(jì)注意事項(xiàng)

    ESP8266 12E如何升級到最新固件?

    ESP8266 12E如何升級到最新固件
    發(fā)表于 07-22 07:03

    ESP-01升級后,PC執(zhí)行ping操作時(shí),數(shù)據(jù)包丟失了,怎么解決?

    我將 ESP-01 升級到版本“0020000903” 我嘗試制作網(wǎng)絡(luò)服務(wù)器應(yīng)用程序 - (我成功了,我能夠在谷歌瀏覽器上看到我的網(wǎng)頁) 一切都很好,但是待機(jī) 5 分鐘后 ESP 不再
    發(fā)表于 07-17 06:09

    將Non-OS SDK1.3.0升級到1.4.0后,AT CWLAP命令將無法再找到我的AP,為什么?

    將Non-OS SDK1.3.0升級到1.4.0(AT版本0.40升級到0.50)后,AT CWLAP命令將無法再找到我的AP。它仍然會找到一些 AP,但不是我想使用的 AP,它在物理上最接近
    發(fā)表于 07-17 06:00

    OTA升級user2.bin ota升級到user1.bin失敗了的原因?

    使用NONOS SDK 2.0user1.bin ota升級到user2.bin成功,反過來就會失敗,下面是log: system_upgrade_start upgrade_connect
    發(fā)表于 07-11 08:00

    JDK8升級JDK11最全實(shí)踐干貨來了

    呢?值得我們升級嗎?而且升級過程會遇到哪些問題呢?帶著這些問題,本篇文章將帶來完整的JDK8升級JDK11最全實(shí)踐。 2、為什么
    的頭像 發(fā)表于 06-25 14:51 ?837次閱讀
    <b class='flag-5'>JDK8</b><b class='flag-5'>升級</b><b class='flag-5'>JDK</b>11最全實(shí)踐干貨來了

    JDK11升級JDK17最全實(shí)踐干貨來了

    解決你的問題。 上篇文章給大家?guī)砹?b class='flag-5'>JDK8升級JDK11的最全實(shí)踐,相信大家閱讀后已經(jīng)對JDK11有了比較深入的了解。2021年9月14日,Oracle發(fā)布了可以長期支持的
    的頭像 發(fā)表于 06-25 14:50 ?1222次閱讀
    <b class='flag-5'>JDK</b>11<b class='flag-5'>升級</b><b class='flag-5'>JDK</b>17最全實(shí)踐干貨來了
    主站蜘蛛池模板: 手机看片福利久久 | 真实女人寂寞偷人视频 | aaa特级毛片 | 日本特级黄录像片 | 久久国产精品久久久久久久久久 | 五月婷婷开心综合 | 色聚网久久综合 | 久久免费国产 | 国产无圣光高清一区二区 | 天天射久久 | 亚洲一区二区三区四区在线 | 亚洲欧美国产视频 | 啪啪午夜免费 | 日韩免费精品视频 | 韩国三级无遮挡床戏视频 | 欧美色婷婷 | 女人被狂躁视频免费网站 | 男男宿舍高h炒肉bl 男男污肉高h坐便器调教 | 在线观看免费视频片 | 男女同床爽爽视频免费 | 天天射天天操天天 | 国产精品福利午夜在线观看 | 欧美成人aaa大片 | 色播图片 | 国产亚洲综合一区 柠檬导航 | 全黄h全肉边做边吃奶在线观看 | 日韩高清在线日韩大片观看网址 | 美女被拍拍拍拍拍拍拍拍 | 人人做人人爽 | 婷婷综合久久狠狠色99h | 性欧美大胆高清视频 | 成人拍拍视频 | 国产综合色在线视频区色吧图片 | 一级特黄特黄的大片免费 | 欧美婷婷| 久久影视免费观看网址 | 手机看片免费永久在线观看 | 欧美a∨ | 韩国精品videosex性韩国 | 伊人久久成人爱综合网 | 色网站在线 |