2014-12-26 245 views
2

我有下面的gradle代码,我不知道如何避免JavaExec任务产生的巨大输出。我还没有找到它的任何选项JavaExec。如果有人知道更好的方式忽略它,请分享它。抑制Gradle的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 
} 
+0

也许只是将'null'分配给'standardOutput'? – Opal

+0

哪种方式分配?任务genSources(类型:JavaExec){... standardOutput = null}给出错误 *出错: 评估根项目“MyProject”时发生问题。 > outputStream == null! – Egor

+0

所以它显然不这样工作。 – Opal

回答

1

正如我认为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; 
} 

什么,你所能做的就是将输出重定向到临时文件(文件将被删除!)用这个线索:

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() }() 
} 

或者如果你想保存这个输出f或进一步阅读:

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的百科全书-io的增加脚本的依赖,并设置standardOutputNullOutputStream。可以做到如下:

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

我只是用一个虚拟的OutputStream,什么也不做其write方法:

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

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

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

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

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

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

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

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

谢谢大家,但我几乎已经忘记了这个剧本,并且关注:) 无论如何,谢谢!是否LogLevel。仅从此任务中压制stdout?现在没有机会检查,但对于未来... – Egor

+0

是的,这就是它为我做的。其他任务不受影响 – Nathan

+0

这对我使用gradle 3.3没有任何效果3.3 –