JDK8升级至JDK17时Maven构建失败问题求助
JDK 8升级到17后Maven构建失败的解决方法
1. 修复Surefire插件兼容性问题
JDK 17与maven-surefire-plugin:2.19.1完全不兼容,3.0.0-M3作为早期预览版对JDK 17的支持也不完善。直接升级到稳定支持JDK 17的版本(如3.2.5及以上),修改pom.xml:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> </plugin> </plugins> </build>
2. 排查并修复测试失败问题
升级JDK后测试失败常见原因及解决方式:
- API兼容性问题:JDK 9+移除/修改了部分旧API(如
sun.misc下的类),查看测试失败堆栈,替换为JDK 17兼容的API。 - 模块系统限制:若项目使用JPMS,需在
module-info.java中声明测试依赖的模块,例如requires junit.jupiter.api;。 - 测试框架版本兼容:JUnit 4.x低版本与JDK 17不兼容,建议升级到4.13.2+,或迁移至JUnit 5(对JDK 17支持更完善)。
- 反射访问权限问题:JDK 9+加强了模块访问控制,测试中若用到反射访问私有成员,需在Surefire插件中添加JVM参数:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <configuration> <argLine> --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED <!-- 根据实际报错补充对应的opens参数 --> </argLine> </configuration> </plugin>
3. 分步验证
- 先执行
mvn clean test -DskipTests确认插件修复后项目能正常编译。 - 移除
-DskipTests参数,根据测试失败日志逐一修复问题。
内容的提问来源于stack exchange,提问作者Soumya
相关产品推荐
相关产品推荐

