Gradle 如何在后台执行渐变外部任务(Exec)?
我正在使用gradle和gulp构建并启动基于JDK6+的JEE web应用程序,web容器是Jetty Gulp用于处理静态资源,例如concat和缩小javascript/css文件。另外,在我的gulp脚本中还有一个Gradle 如何在后台执行渐变外部任务(Exec)?,gradle,jetty,gulp,Gradle,Jetty,Gulp,我正在使用gradle和gulp构建并启动基于JDK6+的JEE web应用程序,web容器是Jetty Gulp用于处理静态资源,例如concat和缩小javascript/css文件。另外,在我的gulp脚本中还有一个watch任务,用于监视静态文件更改并自动重建它们 因此,要在Jetty中启动应用程序,我需要执行以下操作: 使用gulp[gulp任务:构建]构建静态资源 监视静态文件更改[gulp task:Watch],我不直接调用这个gulp任务,它是由一个gradle任务通过Exec
watch
任务,用于监视静态文件更改并自动重建它们
因此,要在Jetty中启动应用程序,我需要执行以下操作:
[gulp任务:构建]
构建静态资源[gulp task:Watch]
,我不直接调用这个gulp任务,它是由一个gradle任务通过Exec类调用的[gradle task:Watch]
[gradle任务:jettyRun]
watch
作为jettyRun
任务的依赖项,因此我认为我只需要从命令行调用gradle jettyRun
,我的应用程序就会启动。但结果和我预期的不一样
以下是我的脚本文件: build.gradle gulpfile.js
结果: 问题: 现在,当执行
gradle watch
任务时,该过程将暂停,因此对于gradle执行jettyRun
任务没有任何更改。我知道这个挂起是由gulp启动的监视进程引起的,因为它正在监视文件更改。但我希望gradle只启动gulp watch过程,并立即返回执行下一个jettyRun
任务
如何做到这一点?另外,我还想查看stdout的watch任务的输出
我知道java中有一个ProcessBuilder,我已经尝试过了,但它不起作用。也许我做错了什么(
您可以使用
ProcessBuilder
在后台启动外部进程,并让gradle继续执行其他任务。此外,finalizedBy
还可以用于在runJetty
完成后停止监视
task watch {
doFirst {
println("Start watching")
ext.process = new ProcessBuilder()
.directory(projectDir)
.command("gulp", "watch")
.start()
}
}
task stopWatching {
doFirst {
println("Stop watching")
if (tasks.watch.process != null) {
tasks.watch.process.destroy()
}
}
}
task runJetty {
finalizedBy stopWatching
}
有帮助吗?或者?我不认为监视任务应该是构建的一部分,它可以被调用一次并一直在后台运行。我认为最好将监视任务分离,并将其放入一些服务器启动脚本中。
var gulp = require('gulp');
gulp.task('build', function(callback) {
// removed the code to make this question as simple as possible.
if (callback != null) callback();
});
gulp.task('watch', function(callback) {
gulp.watch(['./src/static/**/*.js'], ['build']);
if (callback != null) callback();
});
task watch {
doFirst {
println("Start watching")
ext.process = new ProcessBuilder()
.directory(projectDir)
.command("gulp", "watch")
.start()
}
}
task stopWatching {
doFirst {
println("Stop watching")
if (tasks.watch.process != null) {
tasks.watch.process.destroy()
}
}
}
task runJetty {
finalizedBy stopWatching
}