在我的构建文件中,我总是设置选项以默认显示堆栈跟踪
gradle.startParameter.showStacktrace = org.gradle.api.logging.configuration.ShowStacktrace.ALWAYS
当发生意外故障时,这非常有用。但是,有一些类型的故障和原因是典型的(如编译失败或代码质量违规),在这种情况下我不想要堆栈跟踪 - 只需在控制台上有意义的输出即可。
有没有办法禁用某些特定或任务的白名单显示堆栈跟踪?
答案 0 :(得分:1)
这是一种方式,虽然它有点牵扯。这个想法是基于Custom Logger的概念。
想象一下,我们有一个带有2个额外任务的Java项目:
apply plugin: 'java'
task foo() << {
throw new IllegalStateException("from foo")
}
task bar() << {
throw new GradleException("from bar")
}
进一步假设我们想要抑制IllegalStateException
和CompilationFailedException
(但不是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
然后我们观察堆栈跟踪的压缩信息。