我正在使用gradle和gulp来构建和启动基于JDK6 +的JEE Web应用程序,并且Web容器是Jetty。
Gulp用于处理静态资源,例如concat和minify javascript / css文件。此外,我的gulp脚本中有一个watch
任务,它用于观察静态文件更改并自动重建它们。
所以要在Jetty中启动应用程序,我需要做以下事情:
[gulp task: build]
构建静态资源。[gulp task: watch]
,我不直接调用此gulp任务,它是通过 Exec 类[gradle task: watch]
通过gradle任务调用的。[gradle task: jettyRun]
。由于我将gradle任务watch
添加为jettyRun
任务的依赖项,所以我只需要从命令行调用gradle jettyRun
,我的应用程序就会启动。但结果与我的预期不一样。
以下是我的脚本文件:
的build.gradle
apply plugin: 'war'
apply plugin: 'jetty'
repositories {
jcenter()
}
// omit the dependencies here
task watch(type: Exec){
workingDir "${projectDir}"
// Pass build type to npm and gulp.
commandLine "gulp", "watch"
}
jettyRun.dependsOn watch
gulpfile.js
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();
});
结果:
问题:
现在,当执行gradle watch
任务时,进程挂起,对gradle执行jettyRun
任务没有任何更改。我知道这个挂起是由gulp发起的监视进程引起的,因为它正在观察文件的变化。但我希望gradle只是启动gulp watch进程并立即返回执行下一个jettyRun
任务!
怎么做?另外,我想从stdout看到watch任务的输出。
我知道java中有一个ProcessBuilder,我已经尝试过,但它不起作用。也许我做错了什么。 :(
答案 0 :(得分:3)
您可以使用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
}
完成后停止观看。
pom.xml