JDK从8升级到21的问题集

news/2025/9/22 15:55:29/文章来源:https://www.cnblogs.com/Jcloud/p/19105430

一、背景与挑战

1.升级动因
Oracle长期支持策略
现代特性需求:协程、模式匹配、ZGC等
安全性与性能的需求
AI新技术引入的版本要求
2.项目情况
100+项目并行升级的协同作战
多技术栈并存
持续集成体系的适配挑战

 

二、进度

应用总数 已完成 应用下线 待升级
100+ 73 13 10+

 

三、主要问题域与解决方案

1. 依赖管理的"蝴蝶效应"

sun.misc.BASE64Encoder等内部API废弃 → 引发编译错误
JAXB/JAX-WS从JDK核心剥离 → XML处理链断裂
Lombok与新版编译器兼容性问题(尤其record类型)

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

 

案例1:历史SDK的编译陷阱

Compilation failure: Compilation failure:
#14 4.173 [ERROR] 不再支持源选项 6。请使用 8 或更高版本。
#14 4.173 [ERROR] 不再支持目标选项 6。请使用 8 或更高版本。
<!-- 旧版本编译器配置导致构建失败 -->
<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><!-- 统一使用release参数 --></configuration>
</plugin>

运行 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与新版编译器兼容性问题

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>

上述两个依赖代码基本一样,推荐使用该版本:

jakarta.annotation:jakarta.annotation-api。

 

2. 模块化的破与立

反射访问的模块墙

[ERROR] Unable to make field private int java.text.SimpleDateFormat.serialVersionOnStream accessible
# 启动参数添加模块开放配置
--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. 语法层面的"时空穿越"

案例1:Base64编解码改造

// JDK8写法(已废弃)
BASE64Encoder encoder =newBASE64Encoder();
String encoded = encoder.encode(data);
// JDK21规范写法
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.或添加模块开放参数:--add-opens java.base/java.text=ALL-UNNAMED

 

4. 隐秘的"依赖战争"

注解包冲突典型案例

[ERROR] javax.annotation.Resource exists in both 
jsr250-api-1.0.jar and jakarta.annotation-api-1.3.5.jar
<!-- 统一使用Jakarta标准 -->
<dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version>
</dependency>
<!-- 排除旧版本依赖 -->
<exclusions><exclusion><groupId>javax.annotation</groupId><artifactId>jsr250-api</artifactId></exclusion>
</exclusions>

5. 构建体系的改造

Maven插件兼容性问题

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

升级策略

1.升级Maven版本
2.统一插件版本
<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>

四、最佳实践总结

1. 本地编译

第一步:在本地进行编译,提前识别出语法错误、版本冲突及不兼容问题。

主要有以下几种场景:

Base64:参照 【Base64编解码改造】

lombok:升级版本

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

maven-compiler-plugin:升级版本

maven-resources-plugin:升级版本

maven-war-plugin:升级版本

 

 

2. 行云构建

同【本地编译】

 

3. 行云部署

a、镜像不匹配:自定义镜像或者使用已申请的jdk21镜像

b、module权限不够:参照【完整模块开放配置模板

c、JDSecurity加解密

所有数据库操作:important.properties配置文件的处理方式

classpath:important.properties 使用PropertyPlaceholderConfigurer进行处理,不要用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. 运行

a、序列化异常

jdk21使用列表视图作为入参,导致jsf接口进行反序列化报错。报错代码如下:

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

将 vendorQueryVo.setVendorCodes(subList) 修改为vendorQueryVo.setVendorCodes(new ArrayList<>(subList)) 即可解决问题

 

b、线程上下文类找不到:使用多线程场景下尽可能使用显式指定线程池【默认情况下 不同运行环境的处理机制不同】

 

 

5. JVM调优

垃圾回收调优

UseParallelGCUseG1GCUseZGC是 Java 虚拟机(JVM)中三种不同的垃圾回收器(Garbage Collector, GC),它们的设计目标和使用场景有所不同。以下是它们的区别:

特性 UseParallelGC UseG1GC UseZGC
设计目标 高吞吐量 平衡吞吐量和延迟 极低延迟
暂停时间 较长 较短 极短
适用堆大小 中小堆(几 GB 到几十 GB) 大堆(几十 GB 到几百 GB) 超大堆(TB 级别)
CPU 消耗 中等 中等 较高
适用场景 批处理、计算密集型任务 对延迟有一定要求的应用 对延迟极其敏感的应用
如果你的应用对吞吐量要求高,且可以接受较长的暂停时间,选择UseParallelGC
如果你的应用对延迟有一定要求,且堆内存较大,选择UseG1GC
如果你的应用对延迟极其敏感,且堆内存非常大,选择UseZGC

仅供参考,具体请按照实际情况来进行调整。

6. RSS内存异常

RSS内存有问题的应用可以尝试使用jemalloc方式替换linux默认的glibc内存分配方式。

问题现象:启动后RSS内存使用率很快达到90%以上,甚至接近于100%。

使用方式:启动脚本增加

if [ ! -f "/usr/local/lib/libjemalloc.so.2" ]; then sudo wget -O /usr/local/lib/libjemalloc.so.2 http://storage.jd.local/ste/jemalloc/x86/5.3.0/libjemalloc.so.2 fi export LD_PRELOAD=$LD_PRELOAD:/usr/local/lib/libjemalloc.so.2

使用效果:

 


 

 

默认模式下稳定后的RSS内存在80%左右,替换后稳定在50%左右,且容器内存使用率也有所变化。

https://taishan.jd.com/mdc/ipMonitor?ip=11.31.93.15&startTime=1747238400000&endTime=1747361529820

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

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

相关文章

网站建设公司调查报告wordpress多国语言版本

首先&#xff0c;Kafka无法保证消息的全局有序性&#xff0c;这是因为Kafka的设计中允许多个生产者并行地向同一个主题写入消息。而且&#xff0c;一个主题可能会被划分为多个分区&#xff0c;每个分区都可以在独立的生产者和消费者之间进行并行处理。因此&#xff0c;生产者将…

wordpress游客变用户品牌网站和优化网站

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的ElasticSearch专栏&#xff0c;本篇博客由B战尚硅谷的ElasticSearch视频总结而来&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f306; 内容速览 1 es数据格…

网站色彩搭配方案泰安市高新区建设局网站

前言 当谈到异步编程时&#xff0c;C#中的async/await是一个强大且方便的工具。它使得编写并发和异步操作变得更加简单和可读&#xff0c;同时提供良好的可维护性。本文将详细解释async/await的使用&#xff0c;以及如何在C#中有效地利用它来实现异步操作。 目录 前言1. async…

先做网站装修还是先买虚拟主机wordpress china 中文

任务7:采集这5页中胜点列的数据,找出胜点最高的召唤师,将召唤师姓名填入答案中 此题采集的是胜点列表的数据如下 通过控制台审查元素查看,可以看到是乱码,记得几年前的快手,小红书,抖音也采用了此类反爬措施,html页面显示的是乱码,浏览器能正常显示数据,大概率就是…

科技公司网站案例做 在线观看免费网站

引言 在数据结构和算法的世界里&#xff0c;平衡二叉搜索树&#xff08;Balanced Binary Search Tree, BST&#xff09;是一种非常重要的数据结构。AVL树&#xff08;Adelson-Velsky和Landis发明的树&#xff09;就是平衡二叉搜索树的一种&#xff0c;它通过自平衡来维护其性质…

网站建设是用自己的服务器重庆室内设计

第1周&#xff1a;SQL入门 学习SQL语句的书写语法和规则从零学会SQL&#xff1a;入门​www.zhihu.com 第2周&#xff1a;查询基础 Select查询语句是SQL中最基础也是最重要的语句&#xff0c;这周我们就来利用Select来对表中的数据进行查询。从零学会SQL&#xff1a;简单查询​w…

福建建设局网站无锡市建设银行总行网站

puppeteer 文档:puppeteer.js中文文档|puppeteerjs中文网|puppeteer爬虫教程 Puppeteer本身依赖6.4以上的Node&#xff0c;但是为了异步超级好用的async/await&#xff0c;推荐使用7.6版本以上的Node。另外headless Chrome本身对服务器依赖的库的版本要求比较高&#xff0c;c…

做网站能用本地的数据库嘛商业空间设计案例网站

1月11日&#xff0c;由零售圈主办、20零售连锁协会协办、30零售行业媒体支持的中国零售圈大会暨2024未来零售跨年盛典在西安落下帷幕&#xff0c;在这个零售行业盛典中&#xff0c;第七在线凭借其高精尖产品和卓越的服务质量成功入选&#xff0c;并荣获了“百灵奖 Buylink Awar…

虚拟主机网站建设网站开发文档范文

11服务&#xff1a; 功能&#xff1a;控制MCU进行重启&#xff0c;重启分为硬重启和软重启&#xff0c;11服务一般代表软重启&#xff0c;虽然它里面有个子服务是硬件重启&#xff0c;这里需要注意下&#xff1b;硬重启在日常工作中一般代表B重启。命令格式&#xff08;请求&am…

做网站犯法了 程序员有责任吗江干网站建设

一、背景 近年来由于危险河道管理措施不到位&#xff0c;调峰电站泄水风险长期存在&#xff0c;信息通报制度缺失以及民众安全警觉性不高等因素导致的水电站在泄洪时冲走下游河道游客以及人民财产的事故频发。 二、系统介绍 水电站智能监测泄洪预警系统是一种集成了物联网、云…

超前探展!2025 云栖大会朋友圈晒图必备

2025 云栖大会来了! 从基础设施、大模型到 Agent 和具身智能 全景呈现 AI 技术演进与产业落地 尽在 9.24-9.26 杭州云栖小镇! 2025 云栖大会将持续三天,来自 50 余个国家的 2000 多位演讲嘉宾将齐聚杭州,通过云栖前…

古蔺中国建设银行网站改变网站的域名空间

其实这篇文章不是这里的&#xff0c;只是&#xff0c;后台很傻B地进不了了。也不知道是什么乱七八糟的问题。先写在这里&#xff0c;当做这么久没更新的偷懒好了。&#xff08;而且&#xff0c;挑出来的这些都是精华呢!&#xff09;&#xff0c;大家各取所需吧&#xff1a; 1. …

html5 公司网站盘锦网站推广

611. 有效三角形的个数 给定一个包含非负整数的数组&#xff0c;你的任务是统计其中可以组成三角形三条边的三元组个数。 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3注意: 数组长度不超过1000。数组里整数的范…

杭州好的做网站公司阿里云申请域名做网站

当提到C的时候&#xff0c;很多人会觉得语法复杂、学习曲线陡峭&#xff0c;并且好像与C语言还有点"纠缠不清"。尽管如此&#xff0c;C仍然是当今世界上最受欢迎和最有影响力的编程语言之一。特别是在当今快速发展的人工智能&#xff08;AI&#xff09;领域&#xff…

衡量网站质量的标准工信部官网查询系统查询手机

微软发布了Entity Framework Core2.1&#xff0c;为EF开发者带来了很多期待已久的特性。EF Core 2.1增加了对SQL GROUP BY的支持&#xff0c;支持延迟加载和数据种子等。EF Core 2.1的第一个重要新增特性是将GroupBy操作符翻译成包含GROUP BY子句的SQL。缺乏这种支持被认为是EF…

织梦响应式茶叶网站模板php网站开发技术

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…

凯里建设网站专注WordPress网站建设开发

在buildAdmin的表格中&#xff0c;通过按钮来选中和取消某一行 这种情况&#xff0c;只适合表格行的单选 在elementplus是这样说的 我们所使用的就是这个方法 看一下buildAdmin中的用法 highlight-current-row 是element-plus 中表格的属性 因为 buildadmin 中的table是对 el…

AutoCAD 2025 CAD 安装包中文永久免费免激活破解版下载及详细安装教程

一、CAD2025软件下载链接 软件名称:CAD2025 软件大小:2.69GB 安装环境:Win10以及以上 下载链接:(建议手机保存后到电脑端打开,下载解压无需任何密码) 夸克网盘:https://pan.quark.cn/s/9e4f2565ec22 迅雷网盘:…

做搜狗手机网站点做建网站

&#x1f680; 前端字段名和后端不一致&#xff1f;解锁 JSON 映射的“隐藏规则” &#x1f31f; 嘿&#xff0c;技术冒险家们&#xff01;&#x1f44b; 今天我们要聊一个开发中常见的“坑”&#xff1a;前端传来的 JSON 参数字段名和后端对象字段名不一致&#xff0c;会发生…

报表神器Stimulsoft再升级!Stimulsoft Reports、Dashboards 和 PDF Forms 2025.4 即将发布!

报表神器Stimulsoft 即将推出 2025.4 新版本,本次更新带来了多项全新功能和优化修复,将为开发者与企业用户带来更高效、更灵活的报表与可视化体验。全球知名的报表解决方案服务商 Stimulsoft 即将推出 Stimulsoft Re…