2014-12-26 229 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 –