掘金 后端 ( ) • 2024-05-07 18:21

升级问题汇总

本文整理某项目从 JDK 1.8 升级到 JDK 17 的几个问题。

  1. rt.jar 中包含了 javax/xml/bind/JAXBException 这个类,如果项目中引用了这个工具类,需要额外添加这个类的两个依赖包 jaxb-api 和 jaxb-impl。
  2. rt.jar 中包含了 sun.misc.BASE64Decodersun.misc.BASE64Encodercom.sun.org.apache.xerces.internal.impl.dv.util.Base64 等工具类,如果项目中用到了这些类进行 Base64 编解码操作,需要都改成 java.util.Base64 工具类。
  3. opens java.lang 异常 Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @2a48d10f 。解决办法:在 java 命令后添加额外的参数 --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED
  4. Kafka Kerberos 认证异常: Caused by: org.apache.kafka.common.KafkaException: javax.security.auth.login.LoginException: Message stream modified (41) 异常。解决办法:修改 Kerberos 的 krb5.conf 文件,去掉 renew_lifetime = 7d 这个默认配置。
  5. 自定义 URLClassloader(name,null)加载java.sql.Driver 异常问题《jvm Java 11中为什么不能用URLClassloader(name,null)加载java.sql.Driver》。这种情况下,JDK1.8 和 JDK 17 的源码就不一样了,不同 JDK 做不到代码兼容,可以通过拉分支或者不同工作目录的方式来打包。
  6. AOP 插件版本不兼容异常:java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut pointCut 。解决办法:升级 aspectjweaver 到高版本支持 JDK17,比如 aspectjweaver-1.9.9.jar 这个包就可以支持了。

启示录

在 JDK 9及以上版本中,模块化系统被引入,代替了之前的JAR文件系统。rt.jar是JDK早期版本中包含的库文件集合,但在JDK 9及以后的版本中,这些库被组织成不同的模块,不再以 rt.jar 的形式存在。

从 JDK 1.8 升级时,用到了 rt.jar 中的工具类的话,不建议拷贝 rt.jar ,毕竟 65M ,太大了。还是逐个排查用到的类,用其他工具类替代比较好。

升级的项目技术比较简单,用原生 SpringMVC 实现的,所以升级过程还是比较顺利的,只碰到了上面六个问题,等下次对 SpringBoot 微服务的项目升级时,估计问题就比较多了,到时候再继续补充。