Gradle 如何在后台执行渐变外部任务(Exec)?

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

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

Gulp用于处理静态资源,例如concat和缩小javascript/css文件。另外,在我的gulp脚本中还有一个
watch
任务,用于监视静态文件更改并自动重建它们

因此,要在Jetty中启动应用程序,我需要执行以下操作:

  • 使用gulp
    [gulp任务:构建]
    构建静态资源
  • 监视静态文件更改
    [gulp task:Watch]
    ,我不直接调用这个gulp任务,它是由一个gradle任务通过Exec类调用的
    [gradle task:Watch]
  • 构建我的java代码并启动Jetty
    [gradle任务:jettyRun]
  • 由于我添加了gradle任务
    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
    }