章
目
录
尽管 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-api
和 jaxb-impl
两个依赖包。
2)Base64 编解码
原项目使用 sun.misc.BASE64Decoder
、sun.misc.BASE64Encoder
和 com.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 的升级。