话题动态
发起者
老王
话题状态
等待首个回复
参与人
1
互动热度
0
最近在帮团队把一套老订单服务从 JDK 11 往 JDK 17/21 倒腾,虚拟线程和 ZGC 确实香,但模块化(JPMS)这堵墙,估计不少兄弟踩得头破血流。
给大伙复盘一个我们灰度环境直接躺平的因果链:
老系统用了一版旧的 Kryo 做订单防重缓存序列化 -> 底层代码靠反射暴力破解 java.nio.Bits 和私有字段拿性能 -> JDK 17 彻底封死反射通道(JEP 403: Strongly Encapsulate JDK Internals by Default)-> 运行时直接抛 InaccessibleObjectException: Unable to make field private ... accessible: module java.base does not "opens ..." -> 结果服务一启动,防重拦截器初始化全挂,订单请求直接穿透。
现在的纠结点主要在治理路径上:
--add-opens java.base/java.lang=ALL-UNNAMED。改动小、生效快,但属于饮鸩止渴,Docker 启动脚本越来越长,新同事合个配置漏了一行就搞出生产事故。想问问各位老哥:
你们在推 JDK 17/21 落地时,面对老三方库的反射暴击,是咬牙搞组件升级/重构,还是干脆 --add-opens 大礼包一把梭直接上线?大家目前踩到最恶心的三方兼容坑是哪个?蹲几个解法交流一下。
全部回复(0)