我可以停止杀死 Gradle 任务的 javaexec 失败吗?

Can I Stop a javaexec Failure Killing a Gradle Task?

我有一个 gradle 任务遍历文件树并对每个匹配的文件进行 javaexec 调用:

task runFeatures {
    doLast {
        fileTree(dir: 'src/test/resources/features', include:'**/*.feature').each { file ->
            javaexec {
                main = "cucumber.api.cli.Main"
                classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
                args = [
                   ...
                   '--plugin', json:build/reports/cucumber/${file.filename}",
                   ...
                   file.absolutePath
                ]
            }
            generateReportFromJson()
        }
    }

这样做的原因是 运行 cucumber/geb 使用 GPars 同时进行测试。

作为对 cucumber 的调用,预计这些 javaexec 会 return 错误,而且很明显,测试框架需要响应错误而不是当场死亡。

但据我所知,一旦功能文件 return 是来自 javaexec 的错误代码,gradle 立即终止整个任务(即整个测试 运行 在这种情况下),而不是为任务提供有关如何响应失败的选项。

在这种情况下,如果有一个场景失败,generateReportFromJson() 永远不会被调用。

有一篇post here作者写了一个javaexec的补丁来解决这个问题。那是在 2012 年,但我找不到那个故事的结局,如果有的话。

所以我能看到的唯一绕过它的方法是从 shell 中调用 gradle 子任务并让子任务执行自动执行 like this。但这至少可以说是笨拙的,特别是因为我的代码需要在 Linux 和 Windows.

上都 运行

有什么我遗漏的吗?

Gradle 任务失败时的行为是停止此任务,然后整个构建失败或继续,以防提供命令行选项 --continue(文档 here).

如果你想为每个文件分别执行javaexec,那么如果一个执行失败,另一个也会尝试执行,那么你必须为每个执行动态定义不同的任务,可能使用task rules.

现在,关于您的以下评论:

generateReportFromJson() never gets called if there's a single scenario failing.

然后generateReportFromJson()doLast块之外。这意味着它将在 gradle 配置阶段被调用,即在 javaexec 被调用之前,所以我不确定它是否与任务失败有关。 但是,要在任务 runFeatures 之后调用 generateReportFromJson(),您只需将其移至单独的任务,然后在使用 --continue 时使其依赖于 runFeatures选项并希望整个构建继续或将新任务定义为 finalizer task thw 并执行新任务而不是 runFeatures.

您可以使用 ignoreExitValue 属性:

配置 javaexec 不会导致构建失败
javaexec {
    ...
    ignoreExitValue = true
}