【发布时间】:2015-07-02 15:58:07
【问题描述】:
我正在使用 gradle 和 gulp 构建和启动我的基于 JDK6+ 的 JEE Web 应用程序,Web 容器是 Jetty。
Gulp 用于处理静态资源,例如 concat 和 minify javascript/css 文件。另外,我的 gulp 脚本中有一个watch 任务,它用于监视静态文件的更改并自动重建它们。
所以要在 Jetty 中启动应用程序,我需要做以下事情:
- 使用 gulp
[gulp task: build]构建静态资源。 - 观察静态文件变化
[gulp task: watch],我不直接调用这个gulp任务,它是由gradle任务通过Exec类调用[gradle task: watch]。 - 构建我的 java 代码并启动 Jetty
[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 任务!
如何做到这一点?另外,我想从标准输出中查看监视任务的输出。
我知道java中有一个ProcessBuilder,我试过了,但它不起作用。也许我做错了什么。 :(
【问题讨论】:
-
this 有帮助吗?还是this plugin?
-
我不认为监视任务应该是构建的一部分,它可以被调用一次并一直在后台运行。我觉得还是把watch任务分离出来放到一些服务器启动脚本里面比较好。