如何在后台执行gradle外部任务(Exec)?

时间:2015-07-02 15:58:08

标签: gradle jetty gulp

我正在使用gradle和gulp来构建和启动基于JDK6 +的JEE Web应用程序,并且Web容器是Jetty。

Gulp用于处理静态资源,例如concat和minify javascript / css文件。此外,我的gulp脚本中有一个watch任务,它用于观察静态文件更改并自动重建它们。

所以要在Jetty中启动应用程序,我需要做以下事情:

  1. 使用gulp [gulp task: build]构建静态资源。
  2. 观看静态文件更改[gulp task: watch],我不直接调用此gulp任务,它是通过 Exec [gradle task: watch]通过gradle任务调用的。
  3. 构建我的java代码并启动Jetty [gradle task: jettyRun]
  4. 由于我将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();
    });
    

    结果:

    The execute result

    问题:

    现在,当执行gradle watch任务时,进程挂起,对gradle执行jettyRun任务没有任何更改。我知道这个挂起是由gulp发起的监视进程引起的,因为它正在观察文件的变化。但我希望gradle只是启动gulp watch进程并立即返回执行下一个jettyRun任务!

    怎么做?另外,我想从stdout看到watch任务的输出。

    我知道java中有一个ProcessBuilder,我已经尝试过,但它不起作用。也许我做错了什么。 :(

    Download all files

1 个答案:

答案 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