升级JDK17后JacocoTestReport任务执行失败求助
JDK17 + JaCoCo 0.8.7 构建报错解决方案
错误原因
JDK17的模块化系统(JPMS)限制了模块内部包的访问权限,JaCoCo 0.8.7在创建IsolatedAntBuilder时,会反射访问java.util.prefs的私有字段,但java.prefs模块默认没把这个包开放给未命名模块(JaCoCo相关代码运行在未命名模块中),所以抛出InaccessibleObjectException。
解决方法
1. 升级JaCoCo版本
JaCoCo 0.8.7对JDK17的支持不足,直接升级到0.8.8及以上版本(推荐0.8.10),后续版本已经修复了模块系统相关的访问问题。在Gradle构建脚本中修改版本:
jacoco { toolVersion = "0.8.10" }
2. 添加JVM参数开放模块权限
如果暂时不想升级JaCoCo,给Gradle构建添加JVM参数,让java.prefs模块开放java.util.prefs包给所有未命名模块:
- 方式一:在项目根目录的
gradle.properties中添加:org.gradle.jvmargs=--add-opens java.prefs/java.util.prefs=ALL-UNNAMED - 方式二:在构建脚本中针对相关任务配置:
// 给测试任务添加参数 tasks.withType(Test) { jacoco { jvmArgs += '--add-opens java.prefs/java.util.prefs=ALL-UNNAMED' } } // 给JaCoCo报告和验证任务添加参数 tasks.withType(JacocoReport) { jvmArgs += '--add-opens java.prefs/java.util.prefs=ALL-UNNAMED' } tasks.withType(JacocoCoverageVerification) { jvmArgs += '--add-opens java.prefs/java.util.prefs=ALL-UNNAMED' }
3. 升级Gradle版本
低版本Gradle和JDK17的模块化系统存在兼容性问题,导致Ant Builder创建失败。确保使用Gradle 7.0及以上版本,比如用命令升级Gradle wrapper:
./gradlew wrapper --gradle-version 7.6
内容的提问来源于stack exchange,提问作者Navneet Singh
相关产品推荐
相关产品推荐

