Gradle 抑制梯度';s JavaExec输出

Gradle 抑制梯度';s JavaExec输出,gradle,Gradle,下面是gradle代码,我不知道如何避免JavaExectask生成的巨大输出。我没有找到它的JavaExec选项。如果有人知道忽略它的更好方法,请分享 def getStubOutput() { return new FileOutputStream(new File("${buildDir}/temp")) } configure(project(':jradius:dictionary-min')) { evaluationDependsOn(':jradius')

下面是gradle代码,我不知道如何避免
JavaExec
task生成的巨大输出。我没有找到它的
JavaExec
选项。如果有人知道忽略它的更好方法,请分享

def getStubOutput() {
    return new FileOutputStream(new File("${buildDir}/temp"))
}

configure(project(':jradius:dictionary-min')) {
    evaluationDependsOn(':jradius')
    sourceSets {
        main {
            java {
                srcDir "${projectDir}/target/dictionary-src"
            }
        }
    }
    dependencies {
        compile project(':jradius:core')
    }
    task genSources(type: JavaExec) {
        main = 'net.jradius.freeradius.RadiusDictionary'
        classpath configurations.all
        args = ["net.jradius.dictionary", "${projectDir}/../freeradius/dict-min", "${projectDir}/target/dictionary-src"]
        maxHeapSize = "800m"
        standardOutput = getStubOutput()
    }
    jar {
        archiveName = "jradius-dictionary-min-1.1.5-SNAPSHOT.jar"
    }
    genSources.dependsOn ':jradius:cloneJradius' 
    compileJava.dependsOn genSources
}

正如在评论中一样,我认为
standardOutput
可以设置为
null
,但以下代码段(取自:
org.gradle.process.internal.AbstractExecHandleBuilder
)表明这是不可能的:

public AbstractExecHandleBuilder setStandardOutput(OutputStream outputStream) {
    if (outputStream == null) {
        throw new IllegalArgumentException("outputStream == null!");
    }
    this.standardOutput = outputStream;
    return this;
}
您可以使用以下oneliner将输出重定向到临时文件(文件将被删除!):

task genSources(type: JavaExec) {
    main = 'net.jradius.freeradius.RadiusDictionary'
    classpath configurations.all
    args = ["net.jradius.dictionary", "${projectDir}/../freeradius/dict-min", "${projectDir}/target/dictionary-src"]
    maxHeapSize = "800m"
    standardOutput = { def f = File.createTempFile('aaa', 'bbb' ); f.deleteOnExit(); f.newOutputStream() }()
}
或者,如果要保存此输出以供进一步阅读:

task genSources(type: JavaExec) {
    main = 'net.jradius.freeradius.RadiusDictionary'
    classpath configurations.all
    args = ["net.jradius.dictionary", "${projectDir}/../freeradius/dict-min", "${projectDir}/target/dictionary-src"]
    maxHeapSize = "800m"
    standardOutput = new File(project.buildDir, 'radius.log').newOutputStream()
}
最后一个选项是将apache commons io添加到脚本依赖项中,并将
standardOutput
设置为
NullOutputStream
。在中,可以按以下方式执行:

import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM

buildscript {

   repositories {
      mavenCentral()
   }

   dependencies {
      classpath 'commons-io:commons-io:2.4'
   }
}

task genSources(type: JavaExec) {
    main = 'net.jradius.freeradius.RadiusDictionary'
    classpath configurations.all
    args = ["net.jradius.dictionary", "${projectDir}/../freeradius/dict-min", "${projectDir}/target/dictionary-src"]
    maxHeapSize = "800m"
    standardOutput = NULL_OUTPUT_STREAM
}

这就是我想到的一切。

我只是使用一个虚拟的OutputStream,它在
写入方法中什么都不做:

def dummyOutputStream = new OutputStream() {
    @Override
    public void write(int b) {}
}

exec {
    executable = name
    standardOutput = dummyOutputStream
    errorOutput = dummyOutputStream
    ignoreExitValue = true
}

这将禁用
javaExec
任务的标准输出:

task myCustomTask(type: javaExec) {
    standardOutput = new ByteArrayOutputStream()

    classpath = ...
    main = ...
    args ....
}

我遇到的一个很好的解决方案是修改任务的日志记录级别。如果将其设置为INFO,那么它将抑制该任务的所有输出,除非gradle使用--INFO运行

或者,您可以将级别设置为LogLevel.QUIET,这将使其完全静音

task chatty(type: Exec) {
    ....
    logging.captureStandardOutput LogLevel.INFO
}

可能只是将
null
分配给
standardOutput
?分配的方式是什么?task genSources(类型:JavaExec){…standardOutput=null}给出了一个错误*出错原因:评估根项目“MyProject”时出现问题。>outputStream==null!所以它显然不是那样工作的。谢谢大家,但我几乎忘记了这个脚本,并且担心:)无论如何,谢谢!这是一个逻辑层次。仅从该任务中取消stdout?现在没有机会检查,但为了未来…是的,这就是它对我的作用。其他任务不受影响。gradle 3.3对我没有任何影响。这项工作对我来说(gradle 4.2.1)。您可能需要添加:
logging.captureStandardErrorLogLevel.INFO
。另外,
LogLevel.QUIET
实际上高于
LogLevel.INFO
。如果要使任务输出静音,应使用最低级别:
LogLevel.DEBUG
。然后,只有在使用
--debug
运行gradle时,才能看到输出。