JavaExec任务因IntelliJ Gradle Runner无法保持UP-TO-DATE状态
解决IntelliJ执行Gradle JavaExec任务时UP-TO-DATE状态不一致问题
问题核心:注册的JavaExec任务在命令行执行时能正常保持UP-TO-DATE,但通过IntelliJ执行时,因IDE自动添加jvmArgumentProvider导致任务输入哈希变化,交替使用两种执行方式时任务永远无法维持UP-TO-DATE状态,高执行成本影响开发流程。
解决方案1:让Gradle忽略jvmArgumentProviders的变化
在任务配置中,使用inputs.ignore排除jvmArgumentProviders属性对UP-TO-DATE状态的影响,这样无论IntelliJ是否添加额外参数,都不会改变任务的输入哈希:
tasks.register<JavaExec>("minimal-reproducer") { mainClass.set("org.example.HelloWorld") classpath = sourceSets["main"].runtimeClasspath inputs.files("src/main/resources") outputs.file("build/output.log") // 忽略jvmArgumentProviders的变化,不影响任务的UP-TO-DATE判断 inputs.ignore(this::jvmArgumentProviders) doFirst { println(jvmArgumentProviders.isEmpty()) } }
解决方案2:清除IntelliJ添加的额外jvmArgumentProviders
通过afterEvaluate钩子识别并移除IntelliJ自动添加的参数提供者,确保任务的输入始终一致:
tasks.register<JavaExec>("minimal-reproducer") { mainClass.set("org.example.HelloWorld") classpath = sourceSets["main"].runtimeClasspath inputs.files("src/main/resources") outputs.file("build/output.log") afterEvaluate { // 移除类名包含IntelliJ/Idea特征的参数提供者 jvmArgumentProviders.removeIf { it.javaClass.name.contains("IntelliJ") || it.javaClass.name.contains("Idea") } } doFirst { println(jvmArgumentProviders.isEmpty()) } }
解决方案3:修改IntelliJ的Gradle runner配置
如果允许修改IDE设置,可以在IntelliJ中关闭自动添加JVM参数的行为:
- 打开
Settings->Build, Execution, Deployment->Build Tools->Gradle->Runner - 取消勾选
Delegate IDE build/run actions to Gradle(若启用),或清空VM options输入框,避免IDE自动注入额外参数
内容的提问来源于stack exchange,提问作者Rokko_11
相关产品推荐
相关产品推荐

