抑制Gradle的JavaExec输出

时间:2014-12-26 14:21:36

标签: gradle

我有下面的gradle代码,我不知道如何避免JavaExec任务生成的巨大输出。我没有找到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
}

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

在评论中,我认为standardOutput可以设置为null,但以下代码(取自:org.gradle.process.internal.AbstractExecHandleBuilder)表明不可能:< / p>

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
}

这就是我的想法。

答案 3 :(得分:1)

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

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

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