You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:35:14