Java 如何在Groovy中读取另一个进程写入的(prinln)文件

Java 如何在Groovy中读取另一个进程写入的(prinln)文件,java,groovy,gradle,Java,Groovy,Gradle,我正在构建运行Tomcat的Gradle脚本(遗憾的是我不能使用Gretty或Cargo插件)。启动Tomcat($Tomcat_HOME/bin/startup.sh)后,我想在Gradle/Groovy中打开文件,然后打印所有输入的行,换句话说:打开文件,跟踪smt new是否出现,打印它 现在我的任务是这样的: task startTomcat(dependsOn: ...) << { def catalinaOut = "${project.TOMCAT_HOME}/

我正在构建运行Tomcat的Gradle脚本(遗憾的是我不能使用Gretty或Cargo插件)。启动Tomcat(
$Tomcat_HOME/bin/startup.sh
)后,我想在Gradle/Groovy中打开文件,然后打印所有输入的行,换句话说:打开文件,跟踪smt new是否出现,打印它

现在我的任务是这样的:

task startTomcat(dependsOn: ...) << {
    def catalinaOut = "${project.TOMCAT_HOME}/logs/catalina.out"
    delete { catalinaOut }
    exec {
        workingDir '.'
        executable "${project.TOMCAT_HOME}/bin/${tomcatStartScript()}"
        environment CATALINA_OPTS: tomcatArgs.join(' ')
    }
    new File(catalinaOut).eachLine { line -> println(line) }
}
task startTomcat(dependsOn:…)println(line)}
}

当然,它不会工作,因为
新文件
会打开并立即关闭文件

您要寻找的基本上是unix上的
tail-f
的行为。因此,处理此问题的一个显而易见的方法就是调用此工具(例如,
['tail','-f',''].execute()

否则就有几个答案

这是一个简单的例子,使用:

buildscript{
repositories.jcenter()
依赖关系{
类路径“commons io:commons io:2.4”
}
}
任务tail println l}]作为org.apache.commons.io.input.TailerListenerAdapter
)
试一试{
tailer.run()
}
最后{
tailer.stop()
}
}
使用
gradletail
运行,并将行添加到提到的文件
/tmp/mylog
。使用
CTRL-C
停止

buildscript {
        repositories.jcenter()
        dependencies {
                classpath 'commons-io:commons-io:2.4'
        }
}

task tail << {
        def tailer = new org.apache.commons.io.input.Tailer(
                "/tmp/mylog" as File,
                [handle: { String l -> println l }] as org.apache.commons.io.input.TailerListenerAdapter
        )
        try {
                tailer.run()
        }
        finally {
                tailer.stop()
        }
}