我有下面的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
}
答案 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 ....
}