仅显示Gradle中的意外异常的堆栈跟踪

时间:2016-08-26 21:09:50

标签: gradle groovy

在我的构建文件中,我总是设置选项以默认显示堆栈跟踪

gradle.startParameter.showStacktrace = org.gradle.api.logging.configuration.ShowStacktrace.ALWAYS 

当发生意外故障时,这非常有用。但是,有一些类型的故障和原因是典型的(如编译失败或代码质量违规),在这种情况下我不想要堆栈跟踪 - 只需在控制台上有意义的输出即可。

有没有办法禁用某些特定或任务的白名单显示堆栈跟踪?

1 个答案:

答案 0 :(得分:1)

这是一种方式,虽然它有点牵扯。这个想法是基于Custom Logger的概念。

想象一下,我们有一个带有2个额外任务的Java项目:

apply plugin: 'java'

task foo() << {
    throw new IllegalStateException("from foo")
}

task bar() << {
    throw new GradleException("from bar") 
}

进一步假设我们想要抑制IllegalStateExceptionCompilationFailedException(但不是GradleException)的堆栈跟踪(或打印精简版本)。为此,请考虑以下init.gradle文件:

useLogger(new CustomEventLogger())

class CustomEventLogger extends BuildAdapter implements TaskExecutionListener {

    def exceptionWhitelist = ["IllegalStateException", "CompilationFailedException"]

    public void beforeExecute(Task task) {
        println "[$task.name]"
    }

    public void afterExecute(Task task, TaskState state) {
        println()
    }
    private def getCauses(def throwable) {
        def causes = []

        def t = throwable

        while (t != null) {
            causes << t.class.simpleName
            t = t.cause
        } 

        causes
    }
    public void buildFinished(BuildResult result) {
        println 'build completed'
        def throwable = result.failure
        if (throwable != null) {
            println "TRACER failed with: " + throwable.class
            def causes = getCauses(throwable)
            if (!hasCauseInWhitelist(causes)) {
                throwable.printStackTrace()
            } else {
                causes.each { println it }
            }
        }
    }
}

必须在命令行中指定init.gradle。例如gradle -I init.gradle compileJava

它将打印指定的两个例外的压缩信息。 (请注意,遍历原因层次结构以查找匹配项。)

缺点是此“完全禁用了Gradle的默认输出”,因此可能需要进一步调整,具体取决于要求。

例如,如果我故意在Java中添加语法错误:

bash$ gradle -I init.gradle compileJava
[compileJava]
~/src/main/java/net/codetojoy/Employee.java:4: error: class, interface, or enum expected
public clazz Employee {
       ^
1 error

build completed
TRACER failed with: class org.gradle.internal.exceptions.LocationAwareException
LocationAwareException
TaskExecutionException
CompilationFailedException

然后我们观察堆栈跟踪的压缩信息。