使用Java 11编译Java 8 Maven多模块项目时MyBatis测试运行失败
根因分析
你配置的<release>8参数仅作用于编译阶段,只能保证编译器输出兼容Java 8的字节码、并检查代码对Java 8标准库API的调用合法性,但不会改变Maven测试阶段的运行时环境:执行mvn test时实际使用的是你本地安装的OpenJDK 11运行时。
本次报错是当前项目使用的MyBatis版本内嵌的javassist版本过低,未适配Java 9+引入的模块系统,在生成懒加载代理、通过反射操作类访问权限时触发空指针。
解决方案
你可以根据项目实际情况选择以下任意一种方案:
- 方案1:升级MyBatis相关依赖到适配高版本JDK的版本
将mybatis核心包升级到3.5.0及以上版本,mybatis-spring包升级到2.0.0及以上版本,这两个版本起已经更新了内嵌的javassist组件,兼容Java 11运行时。 - 方案2:手动覆盖javassist依赖版本
若暂时不方便升级MyBatis,可以在父pom.xml的依赖管理中手动引入高版本独立javassist,覆盖MyBatis内嵌的旧版本:<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.29.2-GA</version> </dependency> - 方案3:测试阶段切换为Java 8运行时
若需要完全对齐Java 8的运行效果,可以在执行mvn test时指定JAVA_HOME为本地Java 8的安装路径,或者给maven-surefire-plugin配置指定Jdk路径,让测试阶段用Java 8运行,彻底规避高版本JDK的兼容性问题。
说明:前两种方案不会改变编译输出的Java 8兼容性,仅修复了代码在Java 11运行时的兼容问题,不影响后续项目升级流程。
内容的提问来源于stack exchange,提问作者Ryan Griffith
相关产品推荐
相关产品推荐

