IntelliJ Gradle测试运行器忽略Test任务中定义的jvmArgs问题
问题描述
我在Gradle(Kotlin DSL)中为所有Test任务配置了如下内容:
tasks.withType<Test>().configureEach { useJUnitPlatform() jvmArgs( "--add-opens", "java.base/java.util=ALL-UNNAMED", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.time=ALL-UNNAMED", "-Xshare:off", ) maxParallelForks = 1 }
通过终端运行所有测试均可通过,但在IntelliJ中设置「Build,Execution,Deployment -> Build Tools -> Gradle -> Run tests using: Intellij IDEA」后运行测试,出现以下错误:
java.lang.reflect.InaccessibleObjectException: Unable to make private static java.time.Instant java.time.Instant.create(long,int) accessible: module java.base does not "opens java.time" to unnamed module @45c8e616
环境信息:
- Java 17
- Kotlin 1.8.10
- Gradle 8.0.2
- IntelliJ IDEA 2023.1(旗舰版)
解决方法
给IDEA测试运行器单独加JVM参数
- 打开「Run/Debug Configurations」——右上角运行按钮旁的下拉菜单里选「Edit Configurations」,或者按
Shift+Alt+F10后选择该选项 - 左侧列表点击「JUnit」,选中要运行的测试配置,也可以点左上角
+号新建一个配置 - 在「VM options」输入框中粘贴以下参数:
--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED -Xshare:off - 点击「Apply」保存配置,重新运行测试即可正常执行
全局配置所有测试的JVM参数
如果不想为每个测试配置单独设置,可以直接全局配置:
- 进入「File -> Settings -> Build, Execution, Deployment -> Testing -> JUnit」
- 在「Default VM options」中填入上述JVM参数
- 保存设置后,所有新创建的测试配置都会自动应用这些参数
改回用Gradle运行测试(简便方案)
如果不需要使用IntelliJ的测试运行器,直接切换回Gradle执行测试即可:
- 进入「File -> Settings -> Build, Execution, Deployment -> Build Tools -> Gradle」
- 将「Run tests using」选项修改为「Gradle」
- 保存设置后,IntelliJ会调用Gradle执行测试,自动使用你之前在Gradle中配置的JVM参数
内容的提问来源于stack exchange,提问作者user657009
相关产品推荐
相关产品推荐

