首页 文章 精选 留言 我的

精选列表

搜索[工具集],共10000篇文章
优秀的个人博客,低调大师

JDK 从 8 升级到 21 的问题集

一、背景与挑战 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调优 垃圾回收调优 UseParallelGC、UseG1GC和UseZGC是 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

优秀的个人博客,低调大师

EMR本地盘实例大规模数据集测试

阿里云最佳实践频道:【点击查看更多上云最佳实践】这里有丰富的企业上云最佳实践,从典型场景入门,提供一系列项目实践方案,降低企业上云门槛的同时满足您的需求! 场景描述 阿里云为了满足大数据场景下的存储需求,在云上推出了本地盘D1机型,这个系列提供了本地盘而非云盘作为存储,提高了磁盘的吞吐能力,发挥Hadoop的就近计算优势。阿里云EMR产品针对本地盘机型,推出了一整套的自动化运维方案,帮助用户方便可靠地使用本地盘机型,不需要关注整个运维过程同时数据的高可靠和服务的高可用。 解决问题 云盘多份冗余数据导致成本高 磁盘吞吐量不高 节点的高可靠分布问题 本地盘与节点的故障监控问题 数据迁移时自动决策问题 自动故障节点迁移与数据平衡问题 产品列表 E-MapReduce 本地盘 专有网络VPC 直达最佳实践 》》

优秀的个人博客,低调大师

HiveServer2集成LDAP做用户认证

HiveServer2支持多种认证方式,通过hive.server2.authentication参数来设置,包括nosasl, none, ldap, kerberos, pam, custom 本文介绍如何在E-MapReduce中使用LDAP配置HiveServer的认证。 配置 配置 值 备注 hive.server2.authentication LDAP xx hive.server2.authentication.ldap.url ldap://{emr-header-1-hostname}:10389 {emr-header-1-hostname}以自己集群为准,可以登录集群的emr-header-1上执行hostname命令获取 hive.server2.authentication.ldap.baseDN ou=people,o=emr

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册