JDK8 升级到 JDK17 的需要注意的问题

后端 潘老师 1周前 (05-07) 32 ℃ (0) 扫码查看

尽管 JDK 8 一直以来作为 Java 开发的中坚力量,然而,随着 Java 的不断发展,JDK17/JDK21等新版本陆续发布,带来了诸多创新功能和增强,重新定义了 Java 开发的可能性。作为最新的长期支持 (LTS) 版本,JDK 17 正是这一持续演进的见证,吸引着开发者探索其变革性的潜力。本文将分享一个java项目从 JDK 1.8 升级到 JDK 17 过程中遇到的几个常见问题及解决方法,并总结一些升级经验,希望能帮助各位开发者顺利完成项目升级。

一、依赖替换

1)JAXB 工具类

原项目使用了 rt.jar 中的 javax.xml.bind.JAXBException 类,升级后需要额外添加 jaxb-apijaxb-impl 两个依赖包。

2)Base64 编解码

原项目使用 sun.misc.BASE64Decodersun.misc.BASE64Encodercom.sun.org.apache.xerces.internal.impl.dv.util.Base64 等类进行 Base64 编解码,需替换为 java.util.Base64 工具类。

二、模块化导致的反射问题

升级后,项目启动报错 java.lang.reflect.InaccessibleObjectException,原因是 JDK 17 强化了模块间的访问限制。

解决办法:在 Java 命令后添加参数 --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED

三、Kafka Kerberos 认证异常

升级后,Kafka Kerberos 认证出现 javax.security.auth.login.LoginException: Message stream modified (41) 异常。原因是 JDK 17 更新了 Kerberos 认证代码。

解决办法:修改 krb5.conf 文件,去掉 renew_lifetime = 7d 配置。

四、自定义类加载器问题

原项目使用自定义 URLClassloader(name, null) 加载 java.sql.Driver,升级后报错。原因是 JDK 17 限制了使用空 URLClassLoader 加载 JDBC 驱动。

解决办法:可通过拉分支或不同工作目录的方式打包,使不同 JDK 版本代码兼容。

五、AOP 插件版本不兼容

升级后,AOP 插件报错 java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut pointCut。原因是 AOP 插件版本过低。解决办法:升级 aspectjweaver 到高版本,如 aspectjweaver-1.9.9.jar

启示总结

1)模块化替代 JAR

JDK 9 及以上版本引入模块化系统,rt.jar 中的类被拆分到不同模块。升级时需关注模块依赖,避免直接拷贝 rt.jar。

2)逐个排查依赖

建议逐个排查项目中用到的类,并使用其他工具类替代已废弃的类。

3)循序渐进测试

升级过程中我们应注意测试,及时发现并解决问题。此外,还有一些其他需要注意的点:

  • 升级前备份项目代码和数据库
  • 确保项目所有依赖都兼容 JDK 17。
  • 充分测试升级后的项目。

以上内容能够帮助你顺利完成 Java 项目从 JDK 1.8 到 JDK 17 的升级。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/12963.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】